python中大型文件的快速解析
我需要解析一个大文件(>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=请求 我要做两次手术- 1) 解析特定服务和记录请求的文件并开始TransactionTime 2) 根据RequestId和记录结束transactionTime再次解析文件 下面提供了我的代码python中大型文件的快速解析,python,regex,parsing,Python,Regex,Parsing,我需要解析一个大文件(>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=请求 我要做两次手术- 1) 解析特定服务和记录请求的文件并开始Transact
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]
上面的代码工作正常,但解析1GB数据需要20分钟。
有什么方法可以让这更快吗。。??
如果我能在一半的时间内得到这个结果,那将非常有帮助。。
忠告
re.search(r'.*RequestId="(.*)",SrvName="%s.*TxTime="(.*)"\)' % service,line,re.M)
在这里,如果服务不断变化,最好使用组*
,然后在匹配后检查该组是否等于服务,这样Python就不必每次都编译一个新的正则表达式
使用
i+=1
而不是i=i+1
(这可能是一个微优化,但无论如何它是更干净的代码)。您可以添加完整的代码示例吗?您是否尝试编写用于文件读取的生成器?