在python中快速解析大文件

时间:2014-03-19 06:09:45

标签: 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 = 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的数据。 有没有什么方法可以让它更快.. ?? 如果我能在一半的时间内得到这个结果,那将会非常有用.. 请提供建议

1 个答案:

答案 0 :(得分:2)

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

如果服务不断变化,最好使用组.*,然后在匹配后检查该组是否等于服务,这样Python就不必每次都编译新的正则表达式。

使用i+=1而不是i = i+1(这可能是微优化,但无论如何都是更干净的代码。)