我有以下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})
}
答案 0 :(得分:4)
你有多少记忆?可能是$group
占用了超过10%的可用内存并导致错误吗?请参阅memory for cumulative operators上的汇总文档。
编辑1:
出于兴趣 - 聚合是否在shell外部工作?例如从司机那里打电话。 我已经看到类似的v8错误,并且在2.4 Theres中将shell更新为v8有可能是它。
编辑2:
如果结果数组在shell中太大,那么也会触发错误:请参阅SERVER-8859。要解决此问题,您可能需要运行多个聚合,方法是尽早执行$match
限制工作集,甚至通过结果集执行$skip
和$limit
分页。
我在Mac上尝试使用2.4.1上的10,070,999个文档聚合并没有得到错误