2

Node.jsのMongoDBコレクションから多くの(500k以上)ドキュメントを返しています。これは、Webサイトに表示するためのものではなく、データを処理するためのものです。これらのドキュメントをすべて取得すると、システムがフリーズします。それをすべてつかむためのより良い方法はありますか?

私はページネーションがうまくいくかもしれないと思っていますか?

編集:これはすでにメインのnode.jsサーバーイベントループの外にあるため、「システムがフリーズする」とは「着信リクエストが処理されていない」という意味ではありませ

4

3 に答える 3

2

私はあなたの大きなフェッチ+プロセスタスクをワーカーキュー、バックグラウンドプロセス、またはフォークメカニズムに配置します(ここにはさまざまなオプションがあります)。

そうすれば、メインイベントループの外で計算を行い、他のリクエストを自由に処理できるようになります。コールバックでMongoルックアップを実行する必要がありますが、計算自体に時間がかかる可能性があるため、ノードが「フリーズ」します。他のリクエストを処理するための休憩を与えることはありません。

于 2011-11-28T15:52:02.787 に答える
2

あなたの状況についてもっと学んだ後、私はいくつかのアイデアを持っています:

  1. MongoのMap/Reduce関数でできる限りのことを行います。おそらく、ノードでスローするデータが少ない場合は、それが解決策になる可能性があります。

  2. おそらく、これだけのデータがシステム上のすべてのメモリを消費しているのでしょう。「フリーズ」は、V8がシステムを停止してガベージコレクションを実行することである可能性があります(このSOの質問を参照)。V8フラグ--trace-gcを使用して、GCをログに記録し、この仮説を証明することができます。( V8とガベージコレクションに関する別のSO回答に感謝します

  3. あなたが提案したように、ページネーションが役立つかもしれません。おそらく、データをさらにワーカーキューに分割することもできます(レコード1〜10を参照するワーカータスクを作成し、レコード11〜20を参照するワーカータスクを作成します)。あなたの計算に応じて

  4. おそらく、データを前処理します。つまり、レコードごとにはるかに小さいデータを返します。または、現在ORMを使用している場合は、この特定の計算にORMを使用しないでください。各レコードに必要なデータのみが含まれていることを確認すると、転送するデータが少なくなり、アプリに必要なメモリが少なくなります。

于 2011-11-28T16:18:22.877 に答える
1

それらすべてを同時に必要としないので(それは私がページネーションについて尋ねていることから推測したものです)、おそらくそれらの500kのものを小さなチャンクに分けてnextTickで処理する方が良いでしょうか?

Kueのようなものを使用して、チャンクをキューに入れ、後で処理することもできます(したがって、すべてが同時に処理されるわけではありません)。

于 2011-11-28T16:01:51.350 に答える