問題タブ [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.
javascript - JSONStream での書き込みでメモリが不足するのはなぜですか?
大きいが巨大ではない JSON オブジェクトの大きな配列を出力ファイルに書き込むアプリケーションがあります。オブジェクトは作成され、書き込まれ、その後破棄されます (つまり、私はオブジェクトを常に保持しているわけではありません)。メモリ使用量を問題にしないようにJSONStreamを使用していますが、機能していません。
これは、私が抱えている問題を示す簡単な例です。
この例では、JSONStream を使用して、それぞれ約 20kB の 70000 個のオブジェクトをファイルにストリーミングします (これは、実際のアプリケーションの範囲内です)。ただし、約 45000 でメモリ不足になります (投稿の最後に完全な出力が表示されます)。
outputTransform.write
また、 を呼び出しているときに、ファイル サイズが 0 のままであることに気付きました(上記の OOM の後も 0 です)。outputTransform.end
が呼び出されるまで成長しません。したがって、出力データがどこかにバッファリングされ、ヒープを使い果たしていると想定しています。
私が予想していた動作outputTransform.write
は、出力がすぐに書き込まれるか、少なくとも扱いやすいサイズのバッファーにバッファーされることでした。そのため、OOM について心配することなく、必要な数のオブジェクトを作成できます。
だから私の質問は、JSONStream がこのすべてのデータをメモリに保持しないようにする方法はありますか?
ヒープ サイズを大きくすることは、実際にはオプションではありません。メモリ バウンドの上限がまだ存在するためです。
完全な出力: