3

pymongo で一括挿入を実行して 500 個のドキュメントを挿入しようとしていますが、このエラーが発生します

File "/usr/lib64/python2.6/site-packages/pymongo/collection.py", line 306, in insert
    continue_on_error, self.__uuid_subtype), safe)
  File "/usr/lib64/python2.6/site-packages/pymongo/connection.py", line 748, in _send_message
    raise AutoReconnect(str(e))
pymongo.errors.AutoReconnect: [Errno 104] Connection reset by peer

私は周りを見回して、挿入されたドキュメントのサイズが16 MBを超えるためにこれが発生することを発見しまし.500ドキュメントのサイズは16 MBを超えるはずです. だから私はこのような500のドキュメント(python辞書)のサイズのサイズをチェックしました

size=0
for dict in dicts:
    size+=dict.__sizeof__()
print size

これは私に与えます502920。これは 500 KB のようなものです。16 MB 未満です。次に、なぜこのエラーが発生するのですか。BSONドキュメントではなくPython辞書のサイズを計算していて、MongoDBはBSONドキュメントを取り込んでいますが、500KBを16+ MBに変えることはできません。さらに、python dict を BSON ドキュメントに変換する方法がわかりません。

私のMongoDBのバージョンは2.0.6で、pymongoのバージョンは2.2.1です

編集 150 個のドキュメントで一括挿入を行うことができますが、それは問題ありませんが、150 個を超えるドキュメントではこのエラーが表示されます

4

3 に答える 3

1

この一括挿入のバグは解決されましたが、pymongo のバージョンを更新する必要がある場合があります。

pip install --upgrade pymongo

于 2014-02-06T23:55:04.187 に答える
0

同じエラーが発生し、次のような独自の小さなバルクを作成して回避しました。

region_list = []
region_counter = 0
write_buffer = 1000
# loop through regions
for region in source_db.region.find({}, region_column):
    region_counter += 1 # up _counter
    region_list.append(region)
    # save bulk if we're at the write buffer
    if region_counter == write_buffer:
        result = user_db.region.insert(region_list)
        region_list = []
        region_counter = 0
# if there is a rest, also save that
if region_counter > 0:
    result = user_db.region.insert(region_list)

お役に立てれば

注意: pymongo 2.6 以降、PyMongo は最大転送サイズに基づいてリストを自動分割します: 「insert() メソッドは、max_message_size に基づいてドキュメントの大きなバッチを複数の挿入メッセージに自動的に分割します」

于 2013-03-13T08:55:00.393 に答える
0

このエラーは、一括挿入されたドキュメントの全体のサイズが 16 MB を超えているために発生します。

My method of calculating the size of dictionaries was wrong.

ディクショナリの各キーを手動で調べたところ、1 つのキーのサイズが 300 KB であることがわかりました。そのため、一括挿入のドキュメントの全体的なサイズは 16 MB を超えました。(500*(300+)KB) > 16 MB. しかし、手動で検査せずに辞書のサイズを計算する方法はまだわかりません。誰かが提案できますか?

于 2012-07-19T13:42:35.363 に答える