python - OSError : [Errno 12] Cannot allocate memory from python subprocess. 调用

标签 python linux memory subprocess popen

我已经阅读了几篇关于这个问题的类似帖子,但似乎没有一个可以直接帮助我。如果这实际上是重复的帖子,请引导我到包含解决方案的线程!

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

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

单独来看,这很好用。但是,当我在这些调用之前还完成了一些其他处理时(不在循环内,实际上只是在循环开始之前将值保存在内存中),它在制作了几个视频后因内存错误而崩溃(实际上是在制作最后一个一)。根据this comment , subprocess.call fork /克隆当前进程,这似乎意味着它请求的内存分配等于我目前在内存中的内存量,这对于我在调用 ffmpeg 时想要做的事情似乎有点过分了。

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

最佳答案

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

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

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

您可以尝试通过 strace 运行您的程序或 Valgrind看看究竟是什么系统调用没有得到它请求的内存。这可以帮助您确定如何降低内存要求。

关于python - OSError : [Errno 12] Cannot allocate memory from python subprocess. 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17978992/

相关文章:

python - sceneRect().translated(x,y) 无法与缩放正常工作

linux - 使用命令行查找 Linux 系统的目标架构

linux - Docker 命令在 Windows 7 上不可用

iphone - 解除分配当前/上一个 View Controller

ios - VM Tracker 交换内存

python - pycassa 多个键上的时间序列数据

python - 添加到 networkx 图的一个节点的图像不显示

python - 任务栏的 wxpython 图标

linux - sed 替换字符串中的数字

multithreading - “reads before reads”在内存排序中是什么意思?