【问题标题】:best way to parsing Large files by regex python通过正则表达式 python 解析大文件的最佳方法
【发布时间】:2013-09-01 19:43:32
【问题描述】:

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

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

【问题讨论】:

  • 你能发布一个你正在寻找的日志行和模式的例子吗?
  • 格式类似于“#DEBUG:: BFM [L4] 5.4401e+08ps MSG DIR:TX SCB_CB TYPE:DATA_REQ CPortID:'h8 SIZE:'d20 NumSeg:'h0001 Msg_Id:'h00000000 " 并且 reg ex 是 ".DEBUG.*MSG."。首先,我将使用空格将其拆分,然后将“字段:值”模式插入到数据库中。
  • 您最好使用处理数据流的程序,例如sed

标签: python regex parsing logfile-analysis


【解决方案1】:

正如其他人所说,分析您的代码以了解其缓慢的原因。 cProfile 模块in conjunction with the gprof2dot tool 可以产生很好的可读信息

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

首先,您可能可以使用内置字符串方法而不是正则表达式来摆脱困境 - 这可能会稍微快一些。如果你需要使用正则表达式,值得在主循环外使用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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 幸运的是,python 有一个很棒的内置详细分析器,所以这里的替代方案不是必需的。
    【解决方案3】:

    “在最短的时间内完成上述任务的最佳方法”是首先弄清楚时间的去向。研究如何分析您的 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)
    

    【讨论】:

    • 感谢 Paul 的回复,其实我是 python 新手。我在我的一个项目中使用它。所以你能告诉我,一般来说,逐行读取一个大文件(比如2GB)并打印它需要多长时间?以及如何知道 reg ex 是有效的。如果你能提供一些关于这个的好链接也很好。
    • @user2109788 - 您将通过自己编写这个简单的测试脚本来了解更多信息。为什么不计时最简单的控制案例?编写一个逐行读取文件的脚本,不要做任何事情。看看这需要多长时间。然后打开一个输出文件,并将读取的行写入输出文件。看看这需要多长时间。这些小测试应该让您对正则表达式程序的下限有所了解。至于改进正则表达式本身,谷歌搜索“正则表达式性能”,你会得到一些关于这个主题的有用文章。
    猜你喜欢
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多