搜索大型文本或日志文件 (10GB+)

Searching through a large text or log file (10GB+)

我正在编写的 Python 脚本的一部分要求我在大型文本或日志文件中找到特定的字符串:如果它存在,则执行某些操作;如果它存在,则执行某些操作;否则,做点别的。

输入的文件非常大 (10GB+)。使用起来感觉极其缓慢和低效:

with open('file.txt') as f:
    for line in f:
        if some_string in line:
            return True
    return False

如果文件中不存在该字符串,则遍历将花费很长时间。

有没有省时的方法来实现这个?

如果您使用的是 Linux 或 BSD (Mac),我会使用 grep 或 awk 创建一个子进程并让他们进行搜索,他们已经对查找字符串进行了数十年的优化在大文件中。如果您只关心它是否存在并且不需要所有实例或计数,请确保包含命令行标志以告诉它在第一次匹配后停止搜索。

尝试处理更大的块而不是单独的行。例如:

def contains(filename, some_string):
    n = len(some_string)
    prev_chunk = ''
    with open(filename) as f:
        while chunk := f.read(2 ** 20):
            if some_string in prev_chunk[-(n-1):] + chunk:
                return True
            prev_chunk = chunk
        return False

我用一些 1 GB 的文件尝试过,检查一个不在其中的字符串花了大约 1 秒。

你可以试试 mmap:

>>> import mmap
>>> import re
>>> f = open("data.log", "r")
>>> mm = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
>>> re.search(b"test", mm)
<re.Match object; span=(12, 16), match=b'test'>