9

我发现很多类似的问题在 python 运行时询问对象的大小。一些答案建议对子进程的内存量设置限制。我不想对子进程的内存设置限制。这就是我想要的——

subprocess.Popen()用来执行外部程序。我可以很好地获得标准输出和process.stdout.readlines()过程process.stderr.readlines()完成后的错误。

当错误的程序进入无限循环并不断产生输出时,我遇到了问题。由于subprocess.Popen()将输出数据存储在内存中,这个无限循环很快就会耗尽整个内存并且程序变慢。

一种解决方案是我可以超时运行命令。但是程序需要不同的时间才能完成。大超时,对于花费小时间并具有无限循环的程序来说,违背了拥有它的目的。

有什么简单的方法可以让命令可以产生的数据量上限为 200MB?如果超过限制命令应该被杀死。

4

2 回答 2

4

首先:它不是subprocess.Popen()存储数据,而是“我们”和“我们的”子进程之间的管道。

你不应该readlines()在这种情况下使用,因为这将无限期地缓冲数据,并且仅在最后将它们作为列表返回(在这种情况下,确实是这个函数存储了数据)。

如果你做类似的事情

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()用 etc. 复制 's 的行为select(),并采取适当的行动。

于 2013-05-02T07:35:33.907 回答
1

你想要什么似乎没有一个简单的答案

http://linux.about.com/library/cmd/blcmdl2_setrlimit.htm

rlimit 有一个标志来限制内存、CPU 或打开文件的数量,但显然没有限制 I/O 的数量。

您应该如前所述手动处理该案例。

于 2013-05-02T07:36:56.587 回答