【问题标题】:Overflow sort stage buffered data usage溢出排序阶段缓冲数据使用
【发布时间】:2015-02-02 11:12:59
【问题描述】:

我们正在运行一个 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 错误:溢出排序阶段缓冲数据使用错误。这似乎暗示排序是在内存中完成的。这是因为它正在对子句进行内存合并排序吗?还是有其他原因导致此错误发生?

【问题讨论】:

  • 你能发布完整的查询解释吗?
  • 也许 mongo 无法合并已排序的平行部分结果。如果您只查询 {from: "a"} 和 {from: "b"},这些行得通吗?一种解决方法是在 mongo 之外手动合并。

标签: mongodb sorting indexing


【解决方案1】:

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

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

希望对您有所帮助。 谢谢。

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 2016-01-15
    • 2015-01-17
    • 2015-08-03
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    相关资源
    最近更新 更多