OSError:无法从python subprocess.call分配内存

我已经阅读了几个类似的post,但没有一个可以直接帮助我。 如果这实际上是一个重复的post,请直接到包含解决scheme的线程!

我保存了一堆图像,然后用subprocess.call在它们上调用ffmpeg。 我为了收集不同的图像做了这么多次。 这基本上是我在做什么:

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

隔离这工作正常。 然而,当我在这些调用之前还做了一些其他的处理(不是在循环中,在循环开始之前只是在内存中保存值),在制作好几个video之后,会发生内存错误一)。 根据这个评论 ,subprocess调用/克隆当前进程,这似乎意味着它要求一个内存分配等于我目前在内存中有多less,这似乎是我想调用ffmpeg 。

我怎么能从Python内调用ffmpeg而不要求分配不必要的内存量?

尽管subprocess.call确实会为进程分叉,而且这个子进程确实有自己的内存空间,这个内存空间最初与父进程(您的python程序)完全相同,但现代操作系统将使用写时复制内存 。 分叉进程的内存开销最初相对较小,只需要内核中几KB的内存进行进程记帐。 直到那个子进程开始修改它的内存需要额外的内存。

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

此外,fork通常是在POSIX系统上创建一个新进程的唯一机制( 见这里 ),所以我不认为有一个subprocess.call实现的fork-then-exec序列的替代方案。

您可以尝试通过strace或Valgrind运行您的程序,以确切地了解哪些系统调用没有获得它请求的内存。 这可能会帮助您确定如何降低您的内存需求。

我今天有同样的问题,我只是通过使用操作系统:

 import os for video in videos: job = ' ffmpeg ' + ... + ' -i ' + video + '.mp4' os.system( job )