ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 循环Pymongo游标在一些迭代后返回bson.errors.InvalidBSON错误

2019-07-05 14:59:08  阅读:512  来源: 互联网

标签:python mongodb pymongo


我正在尝试用pymongo进行简单的查询并循环结果.

这是我正在使用的代码:

data = []
tam = db.my_collection.find({'timestamp': {'$gte': start, '$lte':end}}).count()
for i,d in enumerate(table.find({'timestamp': {'$gte': start, '$lte':end}}):
    print('%s of %s' % (i,tam))
    data.append(d)

start和end变量是datetime python对象.一切都运行良好,直到我得到以下输出:

2987 of 12848
2988 of 12848
2989 of 12848
2990 of 12848
2991 of 12848
2992 of 12848
Traceback (most recent call last):
  File "db_extraction\extract_data.py", line 68, in <module>
    data = extract_data(yesterday,days = 1)
  File "db_extraction\extract_data.py", line 24, in extract_data
    for i,d in enumerate(table.find({'timestamp': {'$gte': start, '$lte':end}}).limit(100000)):
  File "\venv\lib\site-packages\pymongo\cursor.py", line 1169, in next
    if len(self.__data) or self._refresh():
  File "\venv\lib\site-packages\pymongo\cursor.py", line 1106, in _refresh
    self.__send_message(g)
  File "\venv\lib\site-packages\pymongo\cursor.py", line 971, in __send_message
    codec_options=self.__codec_options)
  File "\venv\lib\site-packages\pymongo\cursor.py", line 1055, in _unpack_response
    return response.unpack_response(cursor_id, codec_options)
  File "\venv\lib\site-packages\pymongo\message.py", line 945, in unpack_response
    return bson.decode_all(self.documents, codec_options)
bson.errors.InvalidBSON

我尝试过的第一件事就是更改查询的范围以检查它是否与数据相关,而事实并非如此.另一个范围在6360的1615处停止并且出现相同的错误.

我也试过list(table.find({‘timestamp’:{‘$gte’:start,’$lte’:end}})和同样的错误.

另一个可能相关的信息是第一次查询真的很快.它会在返回错误之前将最后一个数字冻结一段时间.

所以我需要一些帮助.我在这里遇到限制吗?或者关于最新情况的任何线索?

这可能与this 2013 question有关,但作者说他没有输出错误.

谢谢!

编辑:

首先,感谢大家的时间和建议.不幸的是,我测试了所有的sugestions,我在同一个地方得到了同样的错误.我使用mongo shell打印了有问题的文件,它几乎和其他所有文件一样.
我改变了查询的范围,并尝试了其他日子.在所有的日子里都一样的问题,直到我发现一个随机运行给了我一个MEMORY ERROR.

1737 of 8011
1738 of 8011
1739 of 8011
1740 of 8011
1741 of 8011
Traceback (most recent call last):
  File "db_extraction\pymongo_test.py", line 14, in <module>
    for post in all_posts:
  File "\python_modules\venv\lib\site-packages\pymongo\cursor.py", line 1189, in next
    if len(self.__data) or self._refresh():
  File "\python_modules\venv\lib\site-packages\pymongo\cursor.py", line 1126, in _refresh
    self.__send_message(g)
  File "\python_modules\venv\lib\site-packages\pymongo\cursor.py", line 931, in __send_message
    operation, exhaust=self.__exhaust, address=self.__address)
  File "\python_modules\venv\lib\site-packages\pymongo\mongo_client.py", line 1145, in _send_message_with_response
    exhaust)
  File "\python_modules\venv\lib\site-packages\pymongo\mongo_client.py", line 1156, in _reset_on_error
    return func(*args, **kwargs)
  File "\python_modules\venv\lib\site-packages\pymongo\server.py", line 106, in send_message_with_response
    reply = sock_info.receive_message(request_id)
  File "\python_modules\venv\lib\site-packages\pymongo\pool.py", line 612, in receive_message
    self._raise_connection_failure(error)
  File "\python_modules\venv\lib\site-packages\pymongo\pool.py", line 745, in _raise_connection_failure
    raise error
  File "\python_modules\venv\lib\site-packages\pymongo\pool.py", line 610, in receive_message
    self.max_message_size)
  File "\python_modules\venv\lib\site-packages\pymongo\network.py", line 191, in receive_message
    data = _receive_data_on_socket(sock, length - 16)
  File "\python_modules\venv\lib\site-packages\pymongo\network.py", line 227, in _receive_data_on_socket
    buf = bytearray(length)
MemoryError

这是间歇性的.我没有改变任何东西再次运行并得到旧的invalidBSON错误,并再次运行并得到内存错误.

我启动了任务管理器并再次运行,内存确实快速增长到95%的使用率并挂起.查询应该检索8GB RAM机器中的1GB数据,所以…我不知道这是否会发生.无论如何,使用pymongo从mongoDB检索数据并写入文件而不将所有内容都放入内存的代码建议可能会完成这项工作.奖金将是如果有人能解释为什么我得到一个无效的BSON而不是MemoryError(对于绝大多数的运行)在我的情况下.

谢谢

解决方法:

您的代码在我的计算机上正常运行.由于它适用于您的前2992条记录,我认为这些文档可能存在一些不一致.您的集合中的每个文档都遵循相同的架构和格式吗?你的pymongo更新了吗?

如果你想遍历每条记录,这是我的建议:

data = []
all_posts = db.my_collection.find({'timestamp': {'$gte': start, '$lte':end}})
tam = all_posts.count()
i = 0
for post in all_posts:
    i += 1
    print('%s of %s' % (i,tam))
    data.append(post)

问候,

标签:python,mongodb,pymongo
来源: https://codeday.me/bug/20190705/1388122.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有