首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python Popen.communicate()内存限制的替代方案?

Python Popen.communicate()内存限制的替代方案?
EN

Stack Overflow用户
提问于 2011-07-30 07:46:38
回答 3查看 5.9K关注 0票数 20

我有以下Python代码块(运行v2.7),当我处理大型(几GB)文件时,这些代码会导致抛出MemoryError异常:

myProcess = Popen(myCmd, shell=True, stdout=PIPE, stderr=PIPE)
myStdout, myStderr = myProcess.communicate()
sys.stdout.write(myStdout)
if myStderr:
    sys.stderr.write(myStderr)

在读取documentation to Popen.communicate()时,似乎有一些缓冲正在进行:

备注读取的数据缓存在内存中,因此如果数据大小很大或不受限制,请不要使用此方法。

有没有办法禁用这种缓冲,或者在进程运行时强制定期清除缓存?

在Python中运行将to级数据流式传输到stdout的命令时,应该使用什么替代方法

我需要注意的是,我需要处理输出和错误流。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-30 08:15:30

我想我找到了一个解决方案:

myProcess = Popen(myCmd, shell=True, stdout=PIPE, stderr=PIPE)
for ln in myProcess.stdout:
    sys.stdout.write(ln)
for ln in myProcess.stderr:
    sys.stderr.write(ln)

这似乎降低了我的内存使用量,足以完成任务。

更新

我最近发现了一种在Python中处理数据流的更灵活的方法,那就是使用threads。有趣的是,Python在shell脚本可以轻松完成的事情上做得如此之差!

票数 7
EN

Stack Overflow用户

发布于 2011-07-30 08:07:34

如果我需要读取这么大的内容的标准输出,我可能会做的是在创建进程时将其发送到一个文件。

with open(my_large_output_path, 'w') as fo:
    with open(my_large_error_path, 'w') as fe:
        myProcess = Popen(myCmd, shell=True, stdout=fo, stderr=fe)

编辑:如果你需要流,你可以尝试制作一个类似文件的对象,并将其传递给stdout和stderr。(不过,我还没试过这个。)然后,您可以在写入对象时从对象中读取(查询)。

票数 5
EN

Stack Overflow用户

发布于 2021-07-13 06:16:20

对于那些在使用Popen时应用程序在一定时间后挂起的人,请在下面查找我的案例:

一个经验法则,如果你不打算使用stderrstdout streams,那么就不要在of的参数中传递/初始化它们!因为它们会填满,给你带来很多问题。

如果您在一段时间内需要它们,并且需要保持进程运行,那么您可以随时关闭这些流。

try:
    p = Popen(COMMAND, stdout=PIPE, stderr=PIPE)
    # After using stdout and stderr
    p.stdout.close()
    p.stderr.close()
except Exception as e:
    pass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6880090

复制
相关文章

相似问题

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