用regex-python解析大文件的最佳方法

2024-09-19 14:33:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须在python中使用regex解析一个大的日志文件(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分钟。在

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


Tags: 文件数据debug示例datatypedirmsg
3条回答

正如其他人所说的那样,分析一下你的代码,看看它为什么慢。cProfile模块in conjunction with the ^{} tool可以生成可读性很好的信息

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

首先,您可能可以使用内置字符串方法而不是正则表达式,这可能会更快一些。如果需要使用regex,那么值得在主循环之外使用^{}进行预编译

第二种方法是不要每行执行一次插入查询,而是成批进行插入,例如将解析后的信息添加到列表中,当信息达到一定大小时,用^{}方法执行一次插入查询。在

一些不完整的代码,例如:

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

保罗的回答是有道理的,你首先要明白你在哪里“浪费”了时间。 如果没有探查器,最简单的方法是在算法的每个“步骤”前后(打开文件、逐行读取(以及在内部,split/regexp识别调试行所用的时间)、将其插入数据库等,以毫秒为单位发布时间戳。在

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

“在最短时间内完成上述任务的最佳方法”是首先找出时间的去向。研究如何评测Python脚本,以找出哪些部分速度较慢。您可能有一个效率低下的regex。写入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)

相关问题 更多 >