gpt4 book ai didi

python - 通过正则表达式 python 解析大文件的最佳方法

转载 作者:太空宇宙 更新时间:2023-11-04 03:55:54 24 4
gpt4 key购买 nike

我必须在 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

关于python - 通过正则表达式 python 解析大文件的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18509844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com