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。那我为什么会收到这个错误。我知道我正在计算 python 字典而不是 BSON 文档的大小,而 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

由于批量插入的文档的总大小大于 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 回答
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 回答