問題タブ [jsonstream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
40 参照

javascript - JSONStream での書き込みでメモリが不足するのはなぜですか?

大きいが巨大ではない JSON オブジェクトの大きな配列を出力ファイルに書き込むアプリケーションがあります。オブジェクトは作成され、書き込まれ、その後破棄されます (つまり、私はオブジェクトを常に保持しているわけではありません)。メモリ使用量を問題にしないようにJSONStreamを使用していますが、機能していません。

これは、私が抱えている問題を示す簡単な例です。

この例では、JSONStream を使用して、それぞれ約 20kB の 70000 個のオブジェクトをファイルにストリーミングします (これは、実際のアプリケーションの範囲内です)。ただし、約 45000 でメモリ不足になります (投稿の最後に完全な出力が表示されます)。

outputTransform.writeまた、 を呼び出しているときに、ファイル サイズが 0 のままであることに気付きました(上記の OOM の後も 0 です)。outputTransform.endが呼び出されるまで成長しません。したがって、出力データがどこかにバッファリングされ、ヒープを使い果たしていると想定しています。

私が予想していた動作outputTransform.writeは、出力がすぐに書き込まれるか、少なくとも扱いやすいサイズのバッファーにバッファーされることでした。そのため、OOM について心配することなく、必要な数のオブジェクトを作成できます。

だから私の質問は、JSONStream がこのすべてのデータをメモリに保持しないようにする方法はありますか?

ヒープ サイズを大きくすることは、実際にはオプションではありません。メモリ バウンドの上限がまだ存在するためです。


完全な出力: