我必须在 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."
首先,我将使用空格拆分它,然后将“field:value”模式插入到 sqlite3 数据库中;但对于大文件,解析文件大约需要 10 到 15 分钟。
请建议在最短时间内完成上述任务的最佳方法。
请您参考如下方法:
正如其他人所说,分析您的代码以了解它为何缓慢。 cProfile 模块 in conjunction with the gprof2dot tool可以产生很好的可读信息
没有看到你的慢代码,我可以猜测一些可能有帮助的事情:
首先,您可能可以使用内置字符串方法而不是正则表达式 - 这可能会稍微快一些。如果您需要使用正则表达式,值得在主循环外使用 re.compile 进行预编译。
其次是不要每行执行一个插入查询,而是分批执行插入,例如将解析的信息添加到列表中,然后当它达到一定大小时,执行一个插入查询 executemany方法。
一些不完整的代码,如上面的例子:
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
