我需要解析一个大文件(> 1GB)。这些行的格式如下。
2014-03-11- 00.02.46.149069 TBegin(EventId =“XXXX”,RequestId =“Request”,SrvName =“service”,TxTime =“TransactionTime”) ... ... End_TxTime EntityId的新状态='XXXX'新状态设置为'DONE'EventId ='XXXX'RequestId = Request
我必须执行两项操作─ 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 :(得分:2)
re.search(r'.*RequestId="(.*)",SrvName="%s.*TxTime="(.*)"\)' % service,line,re.M)
如果服务不断变化,最好使用组.*
,然后在匹配后检查该组是否等于服务,这样Python就不必每次都编译新的正则表达式。
使用i+=1
而不是i = i+1
(这可能是微优化,但无论如何都是更干净的代码。)