使用subprocess.Popen的Python内存分配错误

我正在做一些生物信息学工作。 我有一个python脚本,它在某个时刻调用一个程序来执行一个昂贵的过程(序列对齐......使用大量的计算能力和内存)。 我使用subprocess.Popen调用它。 当我在一个测试用例上运行它时,它会完成并完成正常工作。 但是,当我在完整文件上运行它时,它将不得不多次为不同的输入集执行此操作,它会死亡。 子过程抛出:

OSError: [Errno 12] Cannot allocate memory

我在这里和这里发现了几个链接,类似的问题,但我不确定它们适用于我的情况。

默认情况下,序列对齐器将尝试请求51000M的内存。 它并不总是那么用,但它可能。 在完整的输入加载和处理的情况下,很多都不可用。 但是,限制它请求的数量或将尝试使用较低的数量,在运行时可能会提供相同的错误。 我也试着用shell = True和同样的东西运行。

这一直困扰着我几天。 谢谢你的帮助。

编辑:展开回溯:

File "..../python2.6/subprocess.py", line 1037, in _execute_child
    self.pid=os.fork()
OSError: [Errno 12] Cannot allocate memory

抛出错误。

Edit2:在64位ubuntu 10.4上运行在python 2.6.4上


我对OP感到非常抱歉。 6年后,没有人提到这是Unix中的一个非常普遍的问题,实际上与Python或生物信息学无关。 调用os.fork()暂时将父进程的内存加倍(父进程的内存必须可用于子进程),然后将其全部抛出以执行exec()。 虽然这个内存并不总是被实际复制,但是系统必须有足够的内存以允许它被复制,因此如果你的父进程使用了​​超过一半的系统内存,并且你可以进行子处理,即使是“wc -l “,你会遇到内存错误。

解决方案是使用posix_spawn,或者在脚本开始时创建所有子进程,而内存消耗很少,然后在父进程完成内存密集型事务后再使用它们。

使用关键字“os.fork”和“memory”的谷歌搜索将显示几个关于主题的Stack Overflow帖子,可以进一步解释发生了什么:)


这与Python或subprocess模块没有任何关系。 subprocess.Popen仅向您报告它从操作系统接收到的错误。 (顺便说一句,你在使用什么操作系统?)从man 2 fork到Linux:

ENOMEM    fork()  failed  to  allocate  the  necessary  kernel  structures
          because memory is tight.

你是否多次调用subprocess.Popen ? 如果是这样,那么我认为你可以做的最好的事情是确保先前的进程调用在下一次调用之前终止并获得。


你使用subprocess.PIPE吗? 我遇到问题并在使用时发现问题。 临时文件通常可以解决问题。

链接地址: http://www.djcxy.com/p/71619.html

上一篇: Python memory allocation error using subprocess.Popen

下一篇: fork () & memory allocation behavior