2

我必须在 python 中使用 reg ex 解析一个大的日志文件(2GB)。在日志文件中,正则表达式匹配我感兴趣的行。日志文件也可能包含不需要的数据。

以下是文件中的示例:

"#DEBUG:: BFM [L4] 5.4401e+08ps MSG DIR:TX SCB_CB TYPE:DATA_REQ CPortID:'h8 SIZE:'d20 NumSeg:'h0001 Msg_Id:'h00000000"

我的正则表达式是".DEBUG.*MSG."

首先,我将使用空格将其拆分,然后将“字段:值”模式插入到 sqlite3 数据库中;但对于大文件,解析文件大约需要 10 到 15 分钟。

请建议在最短的时间内完成上述任务的最佳方法。

4

3 回答 3

2

正如其他人所说,分析您的代码以了解它为什么慢。该cProfile模块与该gprof2dot工具一起可以产生很好的可读信息

在没有看到你的慢代码的情况下,我可以猜到一些可能有帮助的事情:

首先,您可能可以使用内置的字符串方法而不是正则表达式 - 这可能会稍微快一些。如果您需要使用正则表达式,则值得在主循环之外使用re.compile

二是不要每行做一个插入查询,而是批量插入,例如将解析的信息添加到列表中,然后当它达到一定大小时,使用executemany方法执行一个INSERT查询。

一些不完整的代码,作为上面的例子:

import fileinput

parsed_info = []
for linenum, line in enumerate(fileinput.input()):
    if not line.startswith("#DEBUG"):
        continue # Skip line

    msg = line.partition("MSG")[1] # Get everything after MSG
    words = msg.split() # Split on words
    info = {}
    for w in words:
        k, _, v = w.partition(":") # Split each word on first :
        info[k] = v

    parsed_info.append(info)

    if linenum % 10000 == 0: # Or maybe  if len(parsed_info) > 500:
        # Insert everything in parsed_info to database
        ...
        parsed_info = [] # Clear
于 2013-08-29T13:41:26.257 回答
0

“在最短的时间内完成上述任务的最佳方法”是首先弄清楚时间的去向。研究如何分析您的 Python 脚本以找出运行缓慢的部分。您可能有一个效率低下的正则表达式。写入 sqlite 可能是问题所在。但是没有灵丹妙药——一般来说,在 Python 中使用正则表达式逐行处理 2GB 的文本可能会在几分钟内运行,而不是几秒钟。

这是一个测试脚本,它将显示读取文件需要多长时间,一行一行,什么都不做:

from datetime import datetime

start = datetime.now()
for line in open("big_honkin_file.dat"):
    pass
end = datetime.now()
print (end-start)
于 2013-08-29T11:42:31.880 回答
0

保罗的回答是有道理的,你需要先了解你“失去”时间的地方。如果您没有分析器,最简单的方法是在算法的每个“步骤”之前和之后以毫秒为单位发布时间戳(打开文件,逐行读取(在内部,拆分/正则表达式识别所需的时间)调试行),将其插入数据库等...)。

如果不进一步了解您的代码,可能会出现非常耗时的“陷阱”: - 多次打开日志文件 - 每次需要在其中插入数据而不是打开一个连接然后随时写入时打开数据库

于 2013-08-29T12:26:14.053 回答