OSError:[Errno 12]无法从python subprocess.call分配内存

时间:2013-07-31 19:15:10

标签: python linux memory subprocess popen

我在这个问题上看过几篇类似的帖子,但似乎没有人直接帮助我。如果这实际上是一个重复的帖子,请指导我到包含解决方案的线程!

我正在保存一堆图像,然后使用subprocess.call在它们上面调用ffmpeg。对于不同图像的集合,我这样做了很多次。这基本上就是我正在做的事情:

from subprocess import call
for video in videos:
  call(['ffmpeg', ..., '-i', video, video+'.mp4')])

孤立地,这很好。但是,当我在这些调用之前也进行了一些其他的处理(不在循环内,只是在循环开始之前只在内存中保存值),在制作了几个视频后(实际上在制作最后一个视频时,它会因内存错误而崩溃)一)。根据{{​​3}},subprocess.call分叉/克隆当前进程,这似乎意味着它请求的内存分配等于我目前在内存中的容量,这似乎对我想做的事情有点过分。在调用ffmpeg。

如何在不要求分配不必要的内存量的情况下从python中调用ffmpeg?

2 个答案:

答案 0 :(得分:3)

虽然subprocess.call确实分叉了进程,并且这个子进程确实有自己的内存空间,它最初与父进程(你的python程序)相同,但现代操作系统将使用copy-on-write memory 。分叉进程的内存开销最初相对较小,只需要内核中的几KB内存进行进程计费。直到子进程开始对其内存进行更改才需要额外的内存。

在分叉之后,subprocess.call生成的子进程将调用一个exec系统调用,它将ffmpeg加载到内存中并开始执行它。

此外,fork通常是在POSIX系统上创建新进程的唯一机制(see here),所以我认为没有替代subprocess.call实现的fork-then-exec序列

您可以尝试通过straceValgrind运行程序,以确切了解系统调用未获取其请求的内存。这可以帮助您确定如何降低内存需求。

答案 1 :(得分:2)

我今天遇到了同样的问题,我只是使用os:

解决了这个问题
import os
for video in videos:
    job = ' ffmpeg ' + ... + ' -i ' + video + '.mp4'
    os.system( job )