我发现很多类似的问题在python中运行时询问对象的大小。一些答案建议对子流程的内存量设置限制。我不想对子进程的内存设置限制。这就是我想要的 -
我正在使用subprocess.Popen()
来执行外部程序。在此过程完成后,我可以很好地获得process.stdout.readlines()
和process.stderr.readlines()
的标准输出和错误。
当错误的程序进入无限循环并继续产生输出时,我遇到了问题。由于subprocess.Popen()
将输出数据存储在内存中,因此无限循环会快速占用整个内存并减慢程序运行速度。
一个解决方案是我可以使用超时运行命令。但程序需要不同的时间来完成。对于花费很少时间并且具有无限循环的程序而言,大的超时会使得具有它的目的失败。
有没有简单的方法我可以在命令可以产生的数据量上加上200MB的上限?如果它超过限制命令就应该被杀死。
答案 0 :(得分:4)
首先:它不是subprocess.Popen()
存储数据,而是“我们”和“我们的”子流程之间的管道。
在这种情况下你不应该使用readlines()
,因为这将无限期地缓冲数据,并且只在最后将它们作为列表返回(在这种情况下,它确实是存储数据的函数)。 / p>
如果您执行类似
的操作bytes = lines = 0
for line in process.stdout:
bytes += len(line)
lines += 1
if bytes > 200000000 or lines > 10000:
# handle the described situation
break
你可以在你的问题中按照自己的意愿行事。但是你不应该忘记之后杀死子进程以阻止它产生更多的数据。
但是如果你想照顾stderr
,你必须尝试用process.communicate()
等来复制select()
的行为,并采取适当的行动。
答案 1 :(得分:1)
似乎没有一个简单的答案你想要什么
http://linux.about.com/library/cmd/blcmdl2_setrlimit.htm
rlimit有一个标志来限制内存,CPU或打开文件的数量,但显然没有任何限制I / O的数量。
您应该如上所述手动处理案例。