使用聚合时出现Mongo错误:排序超出内存限制

时间:2014-10-15 05:21:08

标签: mongodb aggregation-framework

当我使用聚合排序时,我收到错误代码exceeded memory limit的mongo错误16819

我正在使用mongo 2.6。

查询如下:

db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.aggregate([
     { "$project" : { "visitor_localdate" : 1 , "_id" : 0}}, 
     { "$sort" : { "visitor_localdate" : -1}}
])

5 个答案:

答案 0 :(得分:6)

默认情况下,MongoDB中的聚合发生在内存中,管道阶段的RAM限制为100 Mb。看起来你已超过这个门槛。要处理大型数据集,您应启用聚合管道阶段以将数据写入临时文件。使用allowDiskUse选项:

db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.aggregate([
    { "$project" : { "visitor_localdate" : 1 , "_id" : 0}},
    { "$sort" : { "visitor_localdate" : -1}}
], { "allowDiskUse" : true })

答案 1 :(得分:2)

如果您使用的是聚合查询。请在要排序的字段上放置一个索引,然后使用sort运算符。

注意: 将排序运算符放在管道的开头或$ project,$ unwind和$ group聚合运算符之前。如果$ project,$ unwind或$ group在$ sort操作之前发生,则$ sort不能使用任何索引。 [https://docs.mongodb.com/manual/reference/operator/aggregation/sort/][1]

答案 2 :(得分:2)

要修复它,请在查询中启用 allowDiskUse 选项:

解决办法

参考:内存限制

在 MongoDB 中,in-sort 的最大内存限制是 100M,如果执行更大的排序,则需要使用 allowDiskUse 选项将数据写入临时文件进行排序。

在查询中添加 allowDiskUse 选项:

db.bigdata.aggregate(
[
 {$group : {_id : "$range", total : { $sum : 1 }}},
 {$sort : {total : -1}}
],
 {allowDiskUse: true}
);

答案 3 :(得分:1)

根本不需要聚合。使用查询

db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.find({}, { "_id" : 0, "visitor_localdate" : 1 }).sort({ "visitor_localdate" : -1 })

并在visitor_localdate上添加索引。这比聚合更简单,更快。

答案 4 :(得分:0)

在聚合管道之后使用{ allowDiskUse: true },如下所示:

db.collectionOrView.aggregate([], { allowDiskUse: true });