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

acu*_*ube 4 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}}
])
Run Code Online (Sandbox Code Playgroud)

Dev*_*han 16

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

db.collectionOrView.aggregate([], { allowDiskUse: true });
Run Code Online (Sandbox Code Playgroud)


小智 14

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

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

  • 感谢您的 **注意**,我遇到了在排序之前运行 unwind 的确切问题,并不断收到此错误。交换它们就解决了! (2认同)

Ser*_*kiy 10

默认情况下,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 })
Run Code Online (Sandbox Code Playgroud)

  • 当使用猫鼬时使用这个。`db.BASE_TABLE.aggregate([]).allowDiskUse(true);` (3认同)

wdb*_*ley 5

您根本不需要为此进行聚合。使用查询

db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.find({}, { "_id" : 0, "visitor_localdate" : 1 }).sort({ "visitor_localdate" : -1 })
Run Code Online (Sandbox Code Playgroud)

并在 上建立索引visitor_localdate。这比聚合更简单、更快。

  • 我收到此错误:-“errmsg”:“查找命令期间执行程序错误:操作失败:排序操作使用的 RAM 超过最大 33554432 字节。添加索引,或指定较小的限制。”, (2认同)

Nad*_*ard 5

要修复此问题,请在查询中启用 allowedDiskUse 选项:

解决方案

参考:内存限制

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

将allowDiskUse 选项添加到查询中:

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