首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索大型文本或日志文件(10GB+)

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

Stack Overflow用户
提问于 2021-02-06 06:41:31
回答 3查看 317关注 0票数 2

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

送入的文件非常大(10GB+)。它使用起来非常慢,效率也很低:

代码语言:javascript
复制
with open('file.txt') as f:
    for line in f:
        if some_string in line:
            return True
    return False

如果该字符串不存在于文件中,那么遍历将需要很长时间。

有没有一种省时的方法来实现这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-06 08:37:13

您可以尝试使用mmap

代码语言:javascript
复制
>>> 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'>
票数 2
EN

Stack Overflow用户

发布于 2021-02-06 07:34:32

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

票数 1
EN

Stack Overflow用户

发布于 2021-02-06 07:49:26

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

代码语言:javascript
复制
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秒的时间来检查不在其中的字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66071560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档