迭代大型数据库时{mongodb停止

时间:2018-04-21 03:08:33

标签: node.js mongodb

这是Stackoverflow问题的后续问题:Async Cursor Iteration with Asynchronous Sub-task。这一次略有不同。

在迭代MongoDB文档时,如果目标数据库大小太大,任务将在中间停止。 (单个集合中有超过3000个文档,每个文档都包含冗长的文本,因此.toArray由于内存限制而不可行.3000只是整个数据的一部分,完整数据可能超过10,000文件。)我注意到集合中的文档数量是否大于约。 750,它只是在任务中间停止。

我搜索过以前的Stackoverflow问题来解决这个问题:有人说对大型集合进行迭代需要使用streameachmap代替for/while { {1}}。当我在现实生活中尝试这些建议时,其中没有一个确实起作用。它们也只是停在中间,与cursor迭代几乎没有区别。我真的不喜欢扩展for/while的想法,因为它可能让timeout落后于记忆,但它也无效。

以下所有方法都在cursor条件

流方法

async

while / for method(只需将const cursor = db.collections('mycollection').find() cursor.on('data', doc => { await doSomething(doc)//do something with doc here }) 替换为while

for

map / each / foreach方法(将const cursor = db.collections('mycollection').find() while ( await cursor.hasNext() ) { let doc = await cursor.next() await doSomething(doc) } 替换为map

foreach/each

它们都没有显示出对方的任何差异。他们只是在大约周围迭代时停止。 750个文件,只是挂起。我甚至尝试在const cursor = db.collections('mycollection').find() cursor.map(async doc=>{ await doSomething(doc) }) 队列上注册每个文档并稍后执行Promise.all任务,以便在迭代时光标不会花费太多时间,但会出现同样的问题。

编辑:我认为async/await会混淆其他读者。所以我创建了一个示例代码,以便您可以重现问题。

doSomething()
测试运行

我道歉。。它实际上迭代了所有文件...我认为我其他部分确实做错了。我会详细说明这个与导致麻烦的其他部分。

0 个答案:

没有答案