3

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

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

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

它打印得非常快。

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

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

4

2 回答 2

2

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

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

如果您坚持使用 10gen Java 驱动程序,那么您将需要等待JAVA-709得到解决以获得流式写入功能。异步 Java 驱动程序支持写入流的能力。

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

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

HTH - 罗伯

于 2013-04-16T03:13:20.007 回答
0

事实证明,从 mongo shell 需要的时间也一样长。当我从 shell 进行测试时,结果肯定已经被缓存了,所以我认为我从 shell 中看到了更好的结果,但在我的情况下并非如此。

于 2013-04-15T20:04:19.350 回答