1

特定のコレクション内のすべてのドキュメントをループして、ドキュメントを更新しようとしています (ドキュメント内の情報に基づいて)。私はpymongoを使ってpythonでこれを始めましたが、永遠にかかるようです.dbボックスに移動してjavascriptで実行することにしましたが、それでも停止しているようです. 私はクーデター、千の文書について話しているだけです。私が気づいているように見えるのは:

タスクを開始すると、最初の 500 個のオブジェクトがすぐに更新され、しばらくしてから次の 200 個、少し時間が経つとさらに 100 個のオブジェクトが更新され、その後ますます遅くなり始めます。

コードから update 呼び出しを削除すると、ループが問題なく通過するため、更新が何かをフリーズしているように見えます。

私が実行しているjsは次のとおりです。

mydb = db.getSisterDB(DB_NAME);

var cursor = mydb.user.find({is_registered:true}).limit(3000);
while (cursor.hasNext()) {
    var u = cursor.next();
    /* fix property on user doc */
    mydb.user.update({ _id: u._id }, u);
    print(cursor.objsLeftInBatch());
}
4

1 に答える 1

1

私の推測では、最初の500個のオブジェクトはキャッシュに収まるため、メモリ内で更新され、後でディスクに書き込まれます。ただし、500回の書き込み操作の後、キャッシュはいっぱいになるため、後続の書き込みは、前の変更がディスクに書き込まれるまで待機する必要があります。

コードはデータベースからドキュメント全体を読み取り、それらにいくつかの変更を加えてから、ドキュメント全体をデータベースに送り返します。これは、ドキュメント全体を上書きする必要があることを意味します。これが遅いのは奇跡ではありません。

実際に変更されたフィールドのみを更新するには、updateコマンドで$set演算子を使用する必要があります。

アプリケーションに読み込まずにデータベース上のドキュメントを更新することができれば、パフォーマンスの面でさらに優れたものになります。あなたは、あなたが文書で何をするのか、そしてどのような条件で行うのかを正確に書いていませんでした。それほど複雑でない場合は、これが可能かもしれません。

于 2012-10-05T13:39:19.577 に答える