0

ページがタイムアウトしないようにバッチ プロセスを使用してエクスポートしている非常に大きなデータセットがあります。プロセス全体で 1 時間以上かかる場合があります。私は基本的にプロセスが完了したステータスをページにリロードする drupal バッチを使用しています。各ページ要求は基本的に、しばらく時間がかかる並べ替えを含むクエリを再度実行します。次に、データを一時ファイルにエクスポートします。次のページの読み込みでは、完全な mongo クエリが実行され、並べ替えが行われ、既にエクスポートされたエントリがスキップされ、さらに一時ファイルにエクスポートされます。問題は、ページの読み込みごとにmongoがクエリ全体とソートを再実行することです。次のバッチページで、中断したところから同じカーソルを取得し、次の結果セットを引き続き取得できるようにしたいと考えています。

4

2 に答える 2

1

MongoDB の手動エントリ for にcursor.skip()は、いくつかのアドバイスがあります。

これらの種類のタスクには、範囲ベースのページネーションを使用することを検討してください。つまり、データベース自体ではなく、アプリケーション内のロジックを使用してページネーションを決定し、オブジェクトの範囲を照会します。特定のページに簡単にジャンプする必要がない場合、このアプローチはインデックスの使用率を向上させます。

たとえば、毎晩のバッチ プロセスが過去 24 時間に蓄積されたデータに対して実行される場合、おそらく日付範囲ベースのクエリ (1 日の 1 時間ごとに 1 つ) を実行し、その方法でデータを処理できます。データには、ドキュメントごとに何らかの使用可能なタイム スタンプが含まれていると想定していますが、その考えはわかります。

于 2013-11-13T17:45:49.643 に答える
0

カーソルはサーバー上に存在し、約 10 分間アクティビティがない場合にのみタイムアウトしますが、PHP ドライバーはリクエスト間のカーソルの永続化をサポートしていません。

各要求の最後に、ドライバーは、その要求中に作成された、使い果たされていないすべてのカーソルを強制終了します。これは、MongoCursor オブジェクトへのすべての参照が削除された場合にも発生します (例: $cursor = null)。

これは、アプリケーションがカーソル全体を反復処理しないことが残念ながらかなり一般的であり、パフォーマンスに影響を与える可能性があるため、未使用のカーソルをサーバー上に残しておきたくないためです。

特定のケースではwork around this problem、インデックスを改善してカーソルの読み込みを高速化するのが最善の方法です。また、データの一部のサブセットのみを選択して、その間でデータを要求できる固定ポイントを取得することもできます。

たとえば、レポートの場合、最初のリクエストで午前 1 時から午前 2 時までのすべてのデータを要求する場合があります。次のリクエストでは、Saftschleck が説明するように、午前 2 時から午前 3 時までのすべてのデータを要求します。

また、「オンライン レポート」を行うように設計された集計フレームワークを調べることもできます: http://docs.mongodb.org/manual/aggregation/

于 2013-11-19T22:08:31.753 に答える