9

この問題に関する同様の投稿をいくつか読みましたが、直接役立つものはないようです。これが実際に重複した投稿である場合は、解決策を含むスレッドに誘導してください!

たくさんの画像を保存してから、subprocess.call を使用して ffmpeg を呼び出しています。さまざまな画像のコレクションに対して、これを何度か行います。これは基本的に私がやっていることです:

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

単独では、これは正常に機能します。ただし、これらの呼び出しの前に他の処理も実行している場合 (ループ内ではなく、ループの開始前に文字通りメモリに値を保持するだけです)、いくつかのビデオを作成した後 (実際には最後のビデオを作成している間)、メモリ エラーでクラッシュします。 1)。このコメントによると、 subprocess.call は現在のプロセスをフォーク/クローンします。これは、現在メモリにある量に等しいメモリ割り当てを要求しているようです。 .

不必要な量のメモリを割り当てるように要求せずに、python 内から ffmpeg を呼び出すにはどうすればよいですか?

4

2 に答える 2

4

subprocess.call がプロセスを fork することは事実であり、この子プロセスには親プロセス (Python プログラム) と最初は同じ独自のメモリ空間がありますが、最新のオペレーティング システムではcopy-on-write メモリが使用されます。フォークされたプロセスのメモリ オーバーヘッドは、最初は比較的小さく、プロセス アカウンティングのためにカーネルで数 KB のメモリしか必要としません。追加のメモリが必要になるのは、その子プロセスがそのメモリに変更を加え始めるまではありません。

分岐後、subprocess.call によって生成された子プロセスは exec システム コールの 1 つを呼び出し、ffmpeg をメモリにロードして実行を開始します。

さらに、fork は通常、POSIX システムで新しいプロセスを作成する唯一のメカニズムです (こちらを参照)。そのため、subprocess.call が実装する fork-then-exec シーケンスに代わるものはないと思います。

straceまたはValgrindを使用してプログラムを実行し、要求されたメモリを取得していないシステム コールを正確に確認することができます。これは、メモリ要件を下げる方法を決定するのに役立ちます。

于 2013-10-02T18:18:13.820 に答える