在批量插入时MongoDb中的对等错误重置连接

时间:2012-07-16 05:39:35

标签: bulkinsert pymongo

我试图通过在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

我环顾四周,发现here发生了这种情况,因为插入的文档大小超过16 MB,因此500个文档的大小应该超过16 MB。所以我检查了500个文档(python词典)大小的大小,如下所示

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

这给了我502920。这就像500 KB。方式不到16 MB。那为什么我会得到这个错误。 我知道我正在计算python词典的大小而不是BSON文档而MongoDB会接收BSON文档,但是不能将500KB转换为16+ MB。此外,我不知道如何将python dict转换为A BSON文档。

我的MongoDB版本是2.0.6,pymongo版本是2.2.1

修改 我可以用150个文件进行批量插入,这很好但超过150个文档出现此错误

3 个答案:

答案 0 :(得分:1)

Bulk Inserts bug已解决,但您可能需要更新您的pymongo版本:

pip install --upgrade pymongo

答案 1 :(得分:0)

  

由于批量插入的文档具有错误,因此发生错误   整体大小超过16 MB

My method of calculating the size of dictionaries was wrong.

当我手动检查字典的每个键时,发现1个键的值大小为300 KB。这确实使批量插入文档的总大小超过16 MB。 (500*(300+)KB) > 16 MB。但我仍然不知道如何计算字典的大小而不用手动检查它。有人可以建议吗?

答案 2 :(得分: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自动将大批文档拆分为多个插入消息”