2013-04-15 54 views
3

我在mongodb中运行约120万条记录的查询。查询通过mongo shell和使用Java驱动程序快速执行,但是当我尝试通过Java驱动程序将结果转换为json对象时,它非常缓慢(查询需要< 100ms,但转换为json需要> 30s) 。结果集约有5k项。我正在使用JSON.serialize(cursor)进行转换。mongodb java驱动程序将大型结果集转换为json

虽然我希望它采取的一点点时间来转换成JSON字符串,如果我运行从shell查询,但做

var cursor = //execute query 
var arr = cursor.toArray(); 
arr 

它很快打印出来。

在序列化过程中,mongo服务器统计报告了越来越多的页面错误,但是我增加了我的RAM,使其比整个集合加索引大得多。

想想这里可能会发生什么,以及如何提高转换为json的速度?

回答

2

当您得到游标并且即使有游标时,查询也没有执行,您只能得到一小部分结果。

通常我会建议不要将所有结果加载到内存中,使用toArray()或序列化为内存中的字符串。 50K文档将占用大量客户端内存,并且分配内存的效率也不高。

如果您遇到10gen Java驱动程序,那么您需要等待JAVA-709才能解决流式写入功能。 Asynchronous Java Driver支持写入流的功能。

如果你可以使用外部程序,你可能想看看mongoexport。它可以将JSON写入文件或标准输出,并且应该接近最佳性能。

第一次查询运行时,页面错误是正常的。第二次,如果服务器有足够的内存将整个数据集保存在内存中,则应该看到很少的页面错误。如果您在与服务器相同的机器上运行客户端,它可能会将数据从内存中推出,以便为客户端分配JSON blob所需的内存。

HTH - Rob

+0

感谢您的解释。同意将50k文件放在内存中效率不高。欣赏与支持流式传输的驱动程序的链接。 –

0

事实证明它与mongo shell一样长。当我从shell进行测试时,结果必须已被缓存,所以我认为我从shell中看到了更好的结果,但在我的情况中不是这样。