2014-12-04 15 views
3

我们有一个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错误:溢出排序阶段缓冲数据使用错误。这似乎意味着这种排序是在记忆中完成的。这是因为它正在进行内存合并排序的子句?或者是否有其他原因可能会发生此错误?

+0

你可以发布查询的完整说明吗? – wdberkeley 2014-12-05 16:50:37

+0

也许mongo无法合并排序的相似部分结果。如果您仅查询{from:“a”}和{from:“b”},请执行这些工作吗?一种解决方法可能是在mongo之外手动合并。 – Andras 2015-03-06 15:51:14

回答

1

我也遇到了内存溢出的问题。 我正在使用PHP和MongoDB来处理文档。 当我访问一个可能拥有大量文档的集合时,它会抛出一个错误。 按照以下链接,它一次只能分类高达32MB的数据。 http://docs.mongodb.org/manual/reference/limits/#Sorted-Documents

所以根据MongoDocs中给出的有关排序的描述, 我使用PHP而不是Mongo的sort()方法对从MongoCursor对象转换来的数组排序。

希望它能帮助你。 谢谢。