2017-01-04 3 views
0

私は、ffmpegとffplayを生成し、入力ffmpegからフレームを取り出し、それらを処理して別のffmpegとffplayに出力するNodeJSスクリプトを持っています。これは1080pを1秒間に約3フレーム処理して処理しますが、なんらかの理由で出力に書き込まれた後にバッファを保持します。これは、クラスタワーカーを使用するかどうかにかかわらず発生しますが、そうした場合でもワーカーは多くのメモリを使い始めます。NodeJSバッファはガベージコレクトされていません

答えて

-1

世代別ガベージコレクタを使用します。これは、ヒープを複数の領域で分割し、それらを管理するための特別なアルゴリズムを使用していることを意味します。ほとんどの割り当てである短命オブジェクトの「保育」と、存続期間の長いオブジェクトの1つ以上の領域保育園。

ナーサリは実行オブジェクトの数に比例するアルゴリズムを使用します。つまり、ガベージの代償を払いませんが、メモリを2倍にする必要があります(コレクションではメモリの半分を放棄し、他のオブジェクトにライブオブジェクト)。

旧エリアでは、プログラムが実行されている間に、ルート(グローバル参照、スタックなど)から開始してライブオブジェクトをインクリメンタルにマークするコンパイルマーク&スウィープまたはマーク&を使用して、 (暗い魔法を使って)起こっている。最終的には、大きな休止を生じさせないように、マークされていないすべてのオブジェクトをインクリメンタルに解放する(すべての空きメモリが現在必要ではないことを正しく観察する - 解放されている限り)スペースが満たされているよりも速く立ち上がります)。

これはこれからです。quora answerです。

0

V8のメモリ使用量がmax-old-space-sizeに達すると、Node.jsガベージコレクションが実行されることがあります。これはV8のヒープメモリの制限です(デフォルトは1.4GB程度です)。私たちがあなたを助けることができるようにするには、コードの一部を投稿する必要があります。また、実行しているNode.jsのバージョンを知るのに役立ちます。

スクリプトを実行して、max-old-space-sizeを実際に低い数値に設定して、GCが実際に実行されるようにすることができます。それが実行されるとコードは問題なく、問題はNode.js GC最適化によって引き起こされます。

+0

ありがとうございます。この場合、データを消しているよりも速くデータを消費していました。それで、それは記憶に積み重なった。 –

+0

つまり、私はffmpeg.stdoutを読み込んでいましたが、出力ffmpegが私が与えていたデータを消費している間に、必要なときに正しく一時停止しませんでした。 –

+0

私は、あなたがそれを理解してうれしいと思う。多くのメモリが使用されるまでNode.js GCが動作しないという問題を抱えている人たちのインターネット上のブログ記事はたくさんありますが、同じ問題があるかもしれないと思っています... – mkhanoyan

関連する問題