大方的手电筒 · blob转file java - CSDN文库· 2 月前 · |
个性的木耳 · Linux Bash命令关于程序调试详解 ...· 3 月前 · |
睿智的大熊猫 · 如何:压缩和解压缩文件 - .NET | ...· 6 月前 · |
销魂的风衣 · 还在用log.isDebugEnabled( ...· 1 年前 · |
非常酷的鼠标垫 · Fortran笔记(持续更新) - 简书· 1 年前 · |
我有以下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
的命令时,应该使用什么替代方法
我需要注意的是,我需要处理输出和错误流。
如果我需要读取这么大的内容的标准输出,我可能会做的是在创建进程时将其发送到一个文件。
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。(不过,我还没试过这个。)然后,您可以在写入对象时从对象中读取(查询)。
我想我找到了一个解决方案:
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脚本可以轻松完成的事情上做得如此之差!