0

XML ファイルのセットをダウンロードし、フロー制御のために async モジュール ( https://npmjs.org/package/node-async ) を使用してそれらをデータベースに解析する単純なアプリケーションを構築しています。全体の流れは次のとおりです。

  1. API からのデータセットのリストのダウンロード (単一の要求呼び出し)
  2. 各データセットのメタデータをダウンロードして、XML ファイル (async.each) へのリンクを取得します。
  3. 各データセットの XML をダウンロード (async.parallel)
  4. 各データセットの XML を JSON オブジェクトに解析する (async.parallel)
  5. 各 JSON オブジェクトをデータベースに保存します (async.each)

実際には、各データセットには、一連の非同期子プロセス (3、4、5) のセットである親プロセス (2) があります。私が直面している課題は、特定のプロセスのすべての子プロセスが完了する前に非常に多くの親プロセスが起動するため、子プロセスがイベント ループでキューに入れられているように見え、すべてのプロセスに長い時間がかかることです。特定の親プロセスの子プロセスを解決し、ガベージ コレクションがすべてをクリーンアップできるようにします。この結果、プログラムにメモリ リークがないように見えても、メモリ使用量が依然として高すぎて、最終的にプログラムがクラッシュします。

うまくいった解決策の 1 つは、子プロセスの一部を同期させて、イベント ループ内でグループ化できるようにすることでした。ただし、ここで説明されている代替ソリューションも見ました: https://groups.google.com/forum/#!topic/nodejs/Xp4htMTfvYY、親プロセスをキューにプッシュし、特定の数のみを一度に実行できるようにします. 私の質問は、このタイプのキューイングを処理するためのより堅牢なモジュール、またはこの種のフロー制御を処理するための他の実行可能な代替モジュールを知っている人はいますか? 私は探していましたが、今のところ運がありません。

ありがとう。

4

1 に答える 1

1

これを回答として投稿することにしました:

一度にすべてのプロセスを起動しないでください。1 つのリクエストのコールバックで次のリクエストを起動します。全体的な作業は依然として非同期ですが、各リクエストは連続して実行されます。次に、I/O スループットを最大化するために、同時に実行する特定の数の接続をプールすることができます。async.eachLimit を見て、async.each の各例をそれに置き換えます。

async.parallel 呼び出しも問題を引き起こしている可能性があります。

于 2013-08-09T17:24:25.777 に答える