Mongodb cursor.toArray()已成为瓶颈

时间:2014-12-26 01:33:20

标签: node.js performance mongodb

Mongodb cursor.toArray()已成为瓶颈。我需要处理200万个文档并输出到文件中。我使用跳过和限制选项一次处理10,000个,但它不是很有效。所以我一直在寻找一种内存效率更高的驱动程序。我也试过一次处理10个文件,这需要永远,所以我不确定.each()是否可以解决问题?每次我们检索单个文档时,.nextObject都会进行网络调用吗?

Node.js内存限制为1.5GB,所以我不知道如何处理这些文件。我相信只需在应用程序级别以正确的方式使用mongo游标并且不进行任何数据库级聚合,就可以解决此问题。

1 个答案:

答案 0 :(得分:1)

不应该保留所有文档,因为您可以在从服务器接收文件时将每个文档写入文件。如果您使用带有.eachbatchSize的光标,则可以将每个文档写入文件,在客户端保存的文档不超过batchSize

db.collection.find(query, { "batchSize" : 100 }).each(writeToFile)

来自Node.js driver API docs

  

如果指定批量大小,光标将在任何给定时间仅保留最大批量大小元素

使用跳过和限制来分解结果是一个坏主意。跳过n且限制为m的查询通常必须扫描至少n + m个文档或索引条目。如果您使用跳过和限制进行分页,则最终会使查询必须以(结果总数/限制)的大小进行二次方的工作量,例如:对于1000个文档和100个限制,扫描的文档总数大约为

100 + 200 + 300 + 400 + ... + 1000 = 100 (1 + 2 + 3 + 4 + ... + 10)