3

私のWebスクレイピングプロジェクトでは、前日にスクレイピングしたデータをからに移動する必要がありmongo_collectionますmongo_his_collection

このクエリを使用してデータを移動しています

for record in collection.find():
    his_collection.insert(record)

collection.remove()

正常に動作しますが、MongoDBに10,000 行collectionを超える行が含まれていると壊れることがあります

より少ないリソースで同じタスクを実行できる最適化されたクエリを提案してください

4

5 に答える 5

1

find() を制限していないため、クエリが壊れます。サーバーにカーソルを作成すると、mongod は結果セット全体をメモリにロードしようとします。コレクションが大きすぎる場合、これにより問題が発生したり、失敗したりします。

これを回避するには、スキップ/制限ループを使用します。Java での例を次に示します。

long count = 0

while (true) {
    MongoClient client = new MongoClient();
    DBCursor = client.getDB("your_DB_name").getCollection("mongo_collection").find().sort(new BasicDBObject("$natural", 1)).skip(count).limit(100);

    while (cursor.hasNext()) {
        client.getDB("your_DB_name").getCollection("mongo_his_collection").insert(cursor.next());
        count++;
    }
}

これは機能しますが、書き込みもバッチ処理することでパフォーマンスが向上します。これを行うには、カーソルから DBObject の配列を作成し、1 回の挿入で一度にすべて書き込みます。

また、コピー中にコレクションが変更されている場合、すべてのドキュメントをトラバースするという保証はありません。ドキュメントのサイズが大きくなると一部が移動してしまう可能性があるためです。

于 2014-01-02T18:52:55.673 に答える
0

を使用renameCollectionして直接実行できます。または、異なるモンゴッドの場合は、cloneCollection.

参考文献:

于 2014-04-11T14:19:01.037 に答える