2014-03-19 63 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(这可能是一个微型优化,但无论如何它是更干净的代码)。