python迭代一个非常大的文件流

时间:2014-05-26 15:54:05

标签: python parsing popen

我不是一个经验丰富的蟒蛇编码器,所以请保持温和。

我有一个非常大(100s的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 个答案:

答案 0 :(得分:2)

您的代码完全正常,并且会有效地“流式传输”数据,假设“parseTool”也正确地流式传输并且文本输出没有很长的行。

如果它确实有长行(特别是那些按输入进行缩放的行,而不是有一些上限)那么你需要注意读取小于行的块而不是而不是阅读整行,然后拆分它。

答案 1 :(得分:-1)

您说您的文件是二进制文件。

如果您使用:

for line in proc.stdout:
    ...

然后解释器将读取二进制数据,直到找到新的行字符。

既然你说过“二进制”,那么这就是一个糟糕的解决方案。

我会阅读固定的块:

max_length=1024

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