【问题标题】:Python Popen and communicate result in OSError related to memory allocation?Python Popen 和通信导致与内存分配相关的 OSError?
【发布时间】:2012-11-08 22:30:05
【问题描述】:

我正在向集群上的队列提交作业,并想检查作业是否已完成。我这样做的方法是查看列出当前正在运行的所有作业的命令(称为jobs)的输出中是否存在jobID。我通过外壳调用jobs,解析它的输出并查看jobID 是否存在。如果不是,则将其解释为作业终止的信号:

   sleep = 2
   while True:
        output = subprocess.Popen("jobs %i" %(jobID),
                                  shell=True,
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.PIPE).communicate()
        if job_done(output):
           break
        time.sleep(sleep)

由于sleep 设置为 2,这意味着每两秒检查一次,但作业可能会运行几个小时。我发现我有时会随机得到OSErrorCannot allocate memory,即使机器上有大量内存并且线程除了检查jobs 的输出之外没有执行任何内存密集型操作。这可能是什么原因造成的?有没有比使用PopenPIPEcommunicate 更好的方法?

此问题似乎与此处报告的问题 (Python subprocess.Popen "OSError: [Errno 12] Cannot allocate memory") 相似,但没有解决此问题。

【问题讨论】:

  • The docs 建议在像您这样的情况下,通信很可能会耗尽内存
  • 您提供的链接中有几种解决方案,例如,使用分叉服务器。

标签: python memory-management parallel-processing cluster-computing subprocess


【解决方案1】:

您使用的是哪个 python 版本? 2.6 还是 2.7?甚至更新?您的文件描述符的状态是什么?见fd-issue

在您提到的 SO 帖子的底部,似乎还有另一个关于同一问题的帖子。另见他的proposal

【讨论】:

  • 我使用的是 python 2.6.5。我阅读了您链接到的帖子,但我没有使用close_dfs=True,该帖子说这是问题的原因。我应该使用它吗?即使我使用的是PIPE?
  • 试试 strace:strace -o syscalls.trace -ttT ./yourscript.py 或者更简短的总结 strace strace -o syscalls.trace -Cf ./yourscript.py 在 python 和操作系统的眼中,PIPE 是一个消耗 fd 的文件类对象
  • 我应该在strace 中寻找什么?
  • 对于初学者来说,只是在第一个奇怪的行为和错误。第一个 EMEM 或 EBADF 错误应该有助于朝着正确的方向发展。
  • 但这是否是在 Python 中定期检查进程是否具有特定输出的正确安全方法?有不同的解决方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2015-09-08
  • 2015-03-17
  • 2010-11-24
  • 2013-08-01
  • 1970-01-01
  • 2019-08-12
相关资源
最近更新 更多