我必须在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分钟。在
请提出在最短时间内完成上述任务的最佳方法。在
正如其他人所说的那样,分析一下你的代码,看看它为什么慢。} tool 可以生成可读性很好的信息
cProfile
模块in conjunction with the ^{在看不到您的慢代码的情况下,我可以猜测一些可能有帮助的事情:
首先,您可能可以使用内置字符串方法而不是正则表达式,这可能会更快一些。如果需要使用regex,那么值得在主循环之外使用^{} 进行预编译
第二种方法是不要每行执行一次插入查询,而是成批进行插入,例如将解析后的信息添加到列表中,当信息达到一定大小时,用^{} 方法执行一次插入查询。在
一些不完整的代码,例如:
保罗的回答是有道理的,你首先要明白你在哪里“浪费”了时间。 如果没有探查器,最简单的方法是在算法的每个“步骤”前后(打开文件、逐行读取(以及在内部,split/regexp识别调试行所用的时间)、将其插入数据库等,以毫秒为单位发布时间戳。在
如果不进一步了解您的代码,可能会有一些非常耗时的“陷阱”: -多次打开日志文件 -每次需要插入数据时打开数据库,而不是打开一个连接,然后边写边写
“在最短时间内完成上述任务的最佳方法”是首先找出时间的去向。研究如何评测Python脚本,以找出哪些部分速度较慢。您可能有一个效率低下的regex。写入sqlite可能是个问题。但这并不是什么灵丹妙药——一般来说,在Python中,使用正则表达式逐行处理2GB的文本,可能只需要几分钟,而不是几秒钟。在
下面是一个测试脚本,它将显示逐行读取文件所需的时间,而不执行其他操作:
相关问题 更多 >
编程相关推荐