(Python)尽可能快地计算巨大(> 10GB)文件中的行数

新手上路,请多包涵

我现在有一个非常简单的脚本,它使用 enumerate() 计算文本文件中的行数:

 i = 0
f = open("C:/Users/guest/Desktop/file.log", "r")
for i, line in enumerate(f):
      pass
print i + 1
f.close()

浏览一个 15GB 的日志文件大约需要 3 分半钟,其中约有 3000 万行。如果我能在两分钟或更短时间内完成此操作,那就太好了,因为这些是每日日志,我们希望每月进行一次分析,因此代码将必须处理 30 条约 15GB 的日志——可能超过一个半小时,我们希望最大限度地减少服务器上的时间和内存负载。

我也会接受一个好的近似/估计方法,但它需要大约 4 sig fig 准确……

谢谢!

原文由 Adrienne 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 448
2 个回答

Ignacio 的回答 是正确的,但如果您有 32 位进程,则可能会失败。

但是,按块读取文件然后计算每个块中的 \n 字符可能会很有用。

 def blocks(files, size=65536):
    while True:
        b = files.read(size)
        if not b: break
        yield b

with open("file", "r") as f:
    print sum(bl.count("\n") for bl in blocks(f))

会做你的工作。

请注意,我没有以二进制形式打开文件,因此 \r\n 将转换为 \n ,使计数更可靠。

对于 Python 3,并使其更健壮,用于读取具有各种字符的文件:

 def blocks(files, size=65536):
    while True:
        b = files.read(size)
        if not b: break
        yield b

with open("file", "r",encoding="utf-8",errors='ignore') as f:
    print (sum(bl.count("\n") for bl in blocks(f)))

原文由 glglgl 发布,翻译遵循 CC BY-SA 3.0 许可协议

我知道这有点不公平,但你可以这样做

int(subprocess.check_output("wc -l C:\\alarm.bat").split()[0])

如果您使用的是 Windows,请查看 Coreutils

原文由 Jakob Bowyer 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏