2014-03-19 46 views
0

我有要求解析一個大文件(> 1GB)。這些行格式如下。快速解析python中的大文件

2014-03-11- 00.02.46.149069 TBegin(EVENTID = 「XXXX」,請求ID = 「請求」,SrvName = 「服務」,TXTIME = 「TRANSACTIONTIME」) ... ... End_TxTime新狀態ENTITYID =「XXXX」新狀態設定爲「完成」 = EVENTID「XXXX」的requestId =請求

我必須執行兩個操作 - 1)解析爲文件爲特定服務和記錄請求和開始TRANSACTIONTIME 2 )根據RequestId再次解析文件並記錄結束transactionTime

我的代碼在下面提供。

requestId={} 
    request_arry=[] 
    start_time={} 
    end_time={} 
    f= open(sys.argv[2],"r") 
    for line in f: 
     searchObj1=re.search(r'.*RequestId="(.*)",SrvName="%s.*TxTime="(.*)"\)' % service,line,re.M) 
     if searchObj1: 
      if searchObj1.group(1) in requestId: 
       pass 
     else: 
      requestId[searchObj1.group(1)]=i 
      request_arry.append(searchObj1.group(1)) 
      start_time[searchObj1.group(1)]=searchObj1.group(2) 
      i=i+1 
     searchObj2=re.search(r'.*new state set to(.*).*RequestId = \'(.{16}).*',line,re.M) 
     if searchObj2: 
      if searchObj2.group(2) in requestId: 
      end_time[searchObj2.group(2)]=line[:26] 

上面的代碼工作正常,但需要20分鐘來解析1GB的數據。 有什麼方法可以讓這個更快.. ?? 如果我能得到這樣的結果在一半的時間將是非常有幫助.. 請諮詢

.*再經過
+0

您可以添加完整的代碼示例嗎? –

+0

您是否嘗試過爲文件讀取寫入生成器? – user3

回答

2
re.search(r'.*RequestId="(.*)",SrvName="%s.*TxTime="(.*)"\)' % service,line,re.M) 

這裏,如果服務在不斷變化可能會更好使用一組匹配檢查是否該組等於服務,這樣Python就不必每次都編譯新的正則表達式。

使用i+=1而不是i = i+1(這可能是一個微型優化,但無論如何它是更乾淨的代碼)。