溢出排序阶段缓冲数据使用

时间:2014-12-04 14:18:24

标签: mongodb sorting indexing

我们正在运行mongoDB 2.6.4副本集,并且正在尝试诊断此行为。当我们期望不会时,我们得到Runner error: Overflow sort stage buffered data usage of 33598393 bytes exceeds internal limit of 33554432 bytes。该集合具有数百万条记录,并且具有包含正在排序的键的复合索引。作为一个例子

索引看起来像这样

{ from: 1, time : -1, otherA : 1, otherB : 1}

我们的发现是

 find.collection({ from : { $in : ["a", "b"] }, time : { $gte : timestamp }, 
       otherA : {$in:[...]}, otherB : {$in:[...]}})
       .sort( time : -1 )   

mongoDB与此类查询并行(子句),如下所示:

{ from : a }, { time : { $gte : timestamp }, ... }
{ from : b }, { time : { $gte : timestamp }, ... }

在解释中,每个阶段报告scanAndOrder:false,这意味着该索引用于返回结果。这一切似乎都很好,但mongoDB客户端获取Runner错误:溢出排序阶段缓冲数据使用错误。这似乎意味着排序是在内存中完成的。这是因为它正在对内容进行内存合并排序吗?或者还有其他原因可能会发生此错误吗?

1 个答案:

答案 0 :(得分:1)

我也遇到了同样的内存溢出问题。 我正在使用PHP与MongoDB来操作文档。 当我访问一个可能有大量文档的集合时,它会抛出一个错误。 根据以下链接,它一次最多只能排序32MB数据。 http://docs.mongodb.org/manual/reference/limits/#Sorted-Documents

根据MongoDocs中关于排序的描述, 我使用PHP而不是Mongo的sort()方法对从MongoCursor对象转换的数组进行了排序。

希望它会对你有所帮助。 感谢。