MongoDB:mongoimport在导入大文件时失去连接

时间:2015-11-02 10:30:21

标签: mongodb

我在将JSON文件导入本地MongoDB实例时遇到了一些问题。 JSON是使用mongoexport生成的,看起来像这样。没有数组,没有硬核嵌套:

{"_created":{"$date":"2015-10-20T12:46:25.000Z"},"_etag":"7fab35685eea8d8097656092961d3a9cfe46ffbc","_id":{"$oid":"562637a14e0c9836e0821a5e"},"_updated":{"$date":"2015-10-20T12:46:25.000Z"},"body":"base64 encoded string","sender":"mail@mail.com","type":"answer"}
{"_created":{"$date":"2015-10-20T12:46:25.000Z"},"_etag":"7fab35685eea8d8097656092961d3a9cfe46ffbc","_id":{"$oid":"562637a14e0c9836e0821a5e"},"_updated":{"$date":"2015-10-20T12:46:25.000Z"},"body":"base64 encoded string","sender":"mail@mail.com","type":"answer"}

如果我导入一个包含~300行的9MB文件,则没有问题:

[stekhn latest]$ mongoimport -d mietscraping -c mails mails-small.json 
2015-11-02T10:03:11.353+0100    connected to: localhost
2015-11-02T10:03:11.372+0100    imported 240 documents

但是如果尝试导入大约1300行的32MB文件,则导入失败:

[stekhn latest]$ mongoimport -d mietscraping -c mails mails.json 
2015-11-02T10:05:25.228+0100    connected to: localhost
2015-11-02T10:05:25.735+0100    error inserting documents: lost connection to server
2015-11-02T10:05:25.735+0100    Failed: lost connection to server
2015-11-02T10:05:25.735+0100    imported 0 documents

这是日志:

2015-11-02T11:53:04.146+0100 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:45237 #21 (6 connections now open)
2015-11-02T11:53:04.532+0100 I -        [conn21] Assertion: 10334:BSONObj size: 23592351 (0x167FD9F) is invalid. Size must be between 0 and 16793600(16MB) First element: insert: "mails"
2015-11-02T11:53:04.536+0100 I NETWORK  [conn21] AssertionException handling request, closing client connection: 10334 BSONObj size: 23592351 (0x167FD9F) is invalid. Size must be between 0 and 16793600(16MB) First element: insert: "mails"

之前我听说过16MB limit for BSON documents,但由于我的JSON文件中没有行超过16MB,这应该不是问题,对吧?当我完全相同(32MB)导入我的本地计算机时,一切正常。

任何可能导致这种奇怪行为的想法?

2 个答案:

答案 0 :(得分:65)

我想这个问题与性能有关,你可以用任何方式解决这个问题:

您可以使用 mongoimport选项-j 。如果不能使用4,请尝试增量。即4,8,16,取决于您在cpu中拥有的核心数。

mongoimport --help

-j, - numInsertionWorkers =要运行的插入操作数                                      并发(默认为1)

mongoimport -d mietscraping -c mails -j 4< mails.json

或者您可以拆分文件并导入所有文件。

我希望这对你有所帮助。

多看一点,是某个版本的错误 https://jira.mongodb.org/browse/TOOLS-939 这里可以更改batchSize的另一个解决方案,默认为10000,减小值并测试:

mongoimport -d mietscraping -c mails< mails.json --batchSize 1

答案 1 :(得分:0)

很老,但我在同一个问题上苦苦挣扎。 如果要导入大文件,尤其是使用Compass或通过程序进行远程导入,只需添加

&wtimeoutMS=0

到您的连接字符串。这将删除“写操作超时”。