mongodb java驱动程序将大型结果集转换为json

时间:2013-04-15 19:00:53

标签: java mongodb

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

虽然我希望转换为json字符串需要一点时间,但如果我从shell运行查询但是正在执行

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

打印速度非常快。

mongo服务器统计信息在序列化过程中报告了越来越多的页面错误,但我的RAM增加到远远大于整个集合加上索引。

有关此处可能发生的事情以及如何提高转换为json的速度的任何想法?

2 个答案:

答案 0 :(得分:2)

当你获得光标时查询没有执行,即使它有,你只会得到一小部分结果。

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

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

如果您可以使用外部程序,则可能需要查看mongoexport。它可以将JSON写出到文件或标准输出,并且应该接近最佳性能。

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

HTH - 罗布

答案 1 :(得分:0)

事实证明它与mongo shell一样长。当我从shell测试时,结果必须被缓存,所以我认为我看到了更好的shell结果,但在我的情况下并非如此。