3

我有以下 mongo 版本

db version v2.4.1    
MongoDB shell version: 2.4.1,    

db version v2.2.1-rc1, pdfile version 4.5, 
MongoDB shell version: 2.2.1-rc1

安装在64-bit windows 7机器上。

我有一个包含10001000(1000 万+)条记录的集合,当我使用 V 2.4.1 进行聚合时,它失败并出现以下错误:

Fatal error in CALL_AND_RETRY_2
Allocation failed - process out of memory

但是,当我使用 V 2.2.1-rc1 来聚合相同的集合时,它可以正常工作并在大约 1 分钟内给出结果。

正在聚合的集合的示例文档:

{

    "_id" : ObjectId("516bdd1c39b10c722792e007"),
    "f1" : 10000010,
    "f2" : 10000000,
    "key" : 0
}

聚合命令:

{$group: {"_id": "$key", total: {$sum: "$f1"}}}

用于填充记录的命令:

for(var i = 10011000; i < 10041000; ++i)
{ 
    db.testp.insert({"f1": i+10, "f2": i, "key": i%1000})
}
4

1 回答 1

4

你有多少内存?可能$group是占用了超过 10% 的可用内存并导致错误?请参阅有关累积运算符的内存的聚合文档。

编辑1:

出于兴趣 - 聚合是否在外壳之外工作?例如从驱动程序调用它。我看到了类似的 v8 错误,并且随着 shell 在 2.4 中更新到 v8 有可能是这样。

编辑2:

如果生成的数组在 shell 中太大,那么也会触发错误:请参阅SERVER-8859。要解决此问题,您可能需要运行多个聚合,或者通过$match早期限制工作集,或者甚至$skip通过$limit结果集进行分页。

我在 Mac 上的 2.4.1 上尝试使用 10,070,999 个文档进行聚合,但没有收到错误

于 2013-04-25T09:44:25.493 回答