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

rho*_*ron 8 python linux memory subprocess popen

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

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

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

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

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

Sco*_*rth 4

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

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

此外,fork 通常是在 POSIX 系统上创建新进程的唯一机制(请参阅此处),因此我认为没有 subprocess.call 实现的 fork-then-exec 序列的替代方案。

您可以尝试通过straceValgrind运行您的程序,以准确查看哪个系统调用没有获取它请求的内存。这可以帮助您确定如何降低内存要求。