pymongo.errors.BulkWriteError:发生批处理操作错误(MongoDB 3.4.2,pymongo 3.4.0,python 2.7.13)

时间:2017-03-28 15:39:32

标签: python mongodb pymongo

我正在使用pymongo将几亿条格式{'id_str': , 'created_at': , 'text': }的推文从文本文件迁移到MongoDB。为每个用户创建一个集合来存储他/她的推文。我使用的插入方法是insert_many()。它经常会遇到BulkWriteError

Traceback (most recent call last):
  File "pipeline.py", line 105, in <module>
    timeline_db, meta_db, negative_db, log_col, dir_path)
  File "/media/haitao/Storage/twitter_pipeline/migrate_old.py", line 134, in migrate_dir
    timeline_db[user_id].insert_many(utility.temporal_sort(statuses))
  File "/home/haitao/anaconda3/envs/py27/lib/python2.7/site-packages/pymongo/collection.py", line 711, in insert_many
    blk.execute(self.write_concern.document)
  File "/home/haitao/anaconda3/envs/py27/lib/python2.7/site-packages/pymongo/bulk.py", line 493, in execute
    return self.execute_command(sock_info, generator, write_concern)
  File "/home/haitao/anaconda3/envs/py27/lib/python2.7/site-packages/pymongo/bulk.py", line 331, in execute_command
    raise BulkWriteError(full_result)
pymongo.errors.BulkWriteError: batch op errors occurred

当存在重复的密钥时,似乎会发生此错误,这不应该是这里的情况。还有其他事情我可以检查来解决这个问题吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

抱歉抱歉。

1)我复制了错误。以下内容接近I - [ftdc] Assertion: 13538:couldn't open [/proc/5774/stat] errno:24 Too many open files W FTDC [ftdc] Uncaught exception in 'Location13538: couldn't open [/proc/5774/stat] errno:24 Too many open files' in full-time diagnostic data capture subsystem. Shutting down the full-time diagnostic data capture subsystem. E STORAGE [conn2] WiredTiger (24) [1491020356:127332][5774:0x7f6f30e9d700], WT_SESSION .create: /var/lib/mongodb/: directory-sync: open: Too many open files I COMMAND [conn2] command timeline_db.231731006 command: insert { insert: "231731006", ordered: true, documents: 1000 } ninserted:0 keyUpdates:0 writeConflicts:0 exception: 24: Too many open files code:8 numYields:0 reslen:123 locks:{ Global: { acquireCount: { r: 2, w: 2 } }, Database: { acquireCount: { w: 1, W: 1 } }, Collection: { acquireCount: { w: 1, W: 1 } } } protocol:op_query 511ms``` 的结尾。

MongoClient()

2)是的,只传递了insert_one()的一个实例。

3)没有进行多重处理。

在我发布初始问题后,我开始使用显式提出打开文件限制错误的BulkWriteError。我改变了数据库的设计(主要是减少了集合的数量)并解决了有关打开文件限制的问题。我不确定,但日志似乎表明<head> <script> function validateForm() { var x = document.forms["myForm"]["fname"].value; if (x == "") { alert("Name must be filled out"); return false; </script> </head> 的实际原因也是打开文件限制。

答案 1 :(得分:0)

对我来说,发生此错误是因为第二次在 _id 中进行了复制。

因此,如果我说出 items 来添加Mongo,则 pymongo 会自动插入 object_id aka _id ,然后插入 items 是全局的,它将具有先前操作中的 _id ,这将导致冗余并最终导致BulkWriteError。

清除缓存即可解决