2016-04-08 2 views
3

recent SO questionには、多数のcsvファイルを処理中に実行中のOOM条件がまとめられています。イベントキューのイベントを調整する

問題を探しているほど、Node.jsを読み進めているほど、OOMはメモリリークのために起こっていないと確信しますが、私はデータを抑制していないためですシステムに入力します。

コードはすべてのデータを盲目的に吸い込み、各行に対して単一のコールバックイベントを作成します。イベントはメインイベントループに追加され続け、最終的には非常に大きくなり、使用可能なすべてのメモリが使い果たされます。

このシナリオを処理するためのノードの慣用パターンとは何ですか?私はcsvファイルの読み込みを、一度完全になると、ファイルリーダーがより多くのデータを解析するのをブロックする何らかの種類のブロックキューに結びつけるべきですか?大きなデータセットの処理を扱う良い例がありますか?


更新は:違ったと単純にこれを配置するには、ノードは、より速く、それが出力やたるみが(イベントキューのイベントとしてキューに入れられた)メモリに保存されている処理できるよりも、入力を処理することができます。たるみがたくさんあるので、メモリは最終的に使い果たされます。だから問題は、出力を入力レートを調整する慣用的な方法は何ですか?

+0

私の答えが十分な詳細を提供していない場合、サンプルコードを共有するともっと具体的な例ができます。 – Paul

+0

コードは最初の文でリンクされています。ありがとう。 –

+0

私の間違いは、私はそれについて質問されている質問に関連するコードを見に慣れています。私はすぐに私の答えを更新します。 – Paul

答えて

1

ストリームとしてストリームを設定し、組み込みのバックプレッシャのセマンティクスに依存することをお勧めします。それに関する本当に良い概観としてStreams Handbook。 UNIXと同様に

、ノード・ストリームモジュールの一次組成物演算子は(.pipeと呼ばれる)、あなたはゆっくりと、消費者のために書き込みを絞ること自由のためのバックプレッシャメカニズムを取得します。

更新

私は前に端末入力以外でreadlineモジュールを使用するが、それは入力ストリームと出力ストリームを受け入れるように見えるのドキュメントを読んでいませんでした。 DBライターを書き込み可能なストリームとしてフレーム化する場合は、内部でreadlineをパイプ処理できるようにする必要があります。

+0

ああ!物事は私のために適所をクリックし始めています...私はデータを読むためにストリームを使いましたが、私はパイプを使いませんでした。 –

+1

最終的に、私はreadlineからストリームを実装する[node-csv](https://github.com/wdavidw/node-csv)に切り替えるつもりです。もう一方では、少なくとも2つのライブラリ([mongoose-object-stream](https://tonicdev.com/npm/mongoose-object-stream)と[mongoose-write-stream](https ://www.npmjs.com/package/mongoose-write-stream))。Mongooseの上に書き込み可能なストリームを実装しています。私を正しい方向に向かわせてくれてありがとう。 –

関連する問題