我试图通过在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个文档出现此错误
答案 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自动将大批文档拆分为多个插入消息”