繁体   English   中英

慢正则表达式搜索大文件(大于 5GB)Python

[英]Slow Regex Search Large Files (bigger than 5GB) Python

Python 新手在这里。 我正在尝试搜索大型文档并提取文本。 我需要的实际数据是括号内的值:xx(bb) xx(bb) xx 可以是任何数字组合,而 bb 是任何包含数字的字符,因此您可以拥有包含 1(YJ) 2(*) 的行。 最终目标是将括号内的字符与集合中的值进行比较:{'hO', 'Ih', 'Dn', '8', 'MF', 'dC', '6', 'RE', 'WM'、'Dh'、'5'}。 所以我会检查 YJ 和 * 是否在集合内

为此,我编写了几个方法来解析这个巨大的文件。 问题是,这需要很长时间。 对于大约 1.5GB 的文件,需要 49 秒。 对于大于 5GB 的文件,搜索需要 5 分钟:

方法 1 有效并打印出该行,但与此处的所有方法一样,它很慢:

with open(filename, 'rb', buffering=102400) as f:
    time_data_count = 0
    for line in f:
        # if b'(X,Y)' in line:
        #     print(line)
        if re.search(b'\d+\(.+\)\s+\d+\(.+\)', line) :  
                print(line)

方法 2。此方法的另一个问题是它总是不返回任何内容。 为什么?

with open(filename, 'rb') as f:
    #text = []
    while True:
        memcap = f.read(102400)
        if not memcap:
            break
        text = re.search(b'\d+\(.+\)\s+\d+\(.+\)',memcap)
        if text is None:
            print("none")

方法 3:除非文件小于 1GB,否则仅打印 1 个元素的列表。 为什么是这样?:

with open(filename, 'rb') as f:
    time_data_count = 0
    text = []
    while True:
        memcap = f.read(102400)
        if not memcap:
            break
        text = re.findall(b'\d+\(.+\)\s+\d+\(.+\)',memcap) 
    print(text)

这就是我写的三种方法。 只有 1 可以正常工作。 但他们都有一个慢的问题。 Python 正则表达式一般来说很慢吗? 有没有不同的方法来获得我需要的值类型而不必使用正则表达式? 我认为使用二进制和文件缓冲区会有所帮助,但这与 go 一样快。 请帮忙

如果您使用相同的正则表达式模式进行大量搜索,则应使用re.compile

with open(filename, 'rb', buffering=102400) as f:
    time_data_count = 0
    search_pattern = re.compile(b'\d+\(.+\)\s+\d+\(.+\)')
    for line in f:
        if search_pattern.search(line):  
                print(line)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM