Python遍历非常大的文件流

2 投票
2 回答
552 浏览
提问于 2025-04-18 07:37

我不是一个经验丰富的Python程序员,所以请多包涵。

我有一个非常大的二进制文件(几百GB),需要用一个特定的命令行工具(这里叫做parseTool)来解析它。这个parseTool的输出格式是简单的原始文本,我正在对这些文本进行一些基本处理,比如计数等。

在我考虑在集群上运行多个代码实例之前,我想确保我的做法是合理高效的。

这是我用来遍历parseTool输出的代码:

proc = subprocess.Popen(procTool +' myFile.file ',
                        shell=True,
                        stdout=subprocess.PIPE)
for line in proc.stdout:
    linep=line.split("\t")
    #process each line until end of stream

我想强调的是,我最关心的是如何高效地遍历parseTool的输出。有没有什么好的建议呢?

2 个回答

-1

你说你的文件是二进制格式。

如果你使用:

for line in proc.stdout:
    ...

那么解释器会读取二进制数据,直到找到一个换行符。

既然你提到是“二进制”,这似乎不是个好办法。

我会分块读取:

max_length=1024

while True:
    chunk=proc.stdout.read(max_length)
    if not chunk:
        break
    print chunk
2

你的代码没问题,能够有效地“流式传输”数据,前提是“parseTool”也能正常流式处理,而且文本输出的行不能太长。

如果有很长的行(特别是那些随着输入的增加而变长的行,而不是有个上限的行),那么你就需要注意,最好读比一整行更小的块,而不是先读一整行再去拆分。

撰写回答