Python Mongodb聚合内存不足
我正在使用mongodb aggregate从一个大型集合中抽取文档样本 在连续调用了几次之后,我看到mongodb的内存在上升,大约在第12次调用之后,它由于OutOfMemory错误而崩溃Python Mongodb聚合内存不足,python,mongodb,pymongo,aggregation-framework,Python,Mongodb,Pymongo,Aggregation Framework,我正在使用mongodb aggregate从一个大型集合中抽取文档样本 在连续调用了几次之后,我看到mongodb的内存在上升,大约在第12次调用之后,它由于OutOfMemory错误而崩溃 我如何告诉Mongodb在完成查询处理后释放内存?您这样问的原因是因为您不知道操作符是如何工作的。如报告中所述 要获取N个随机文档,请执行以下操作: 如果N大于或等于集合中文档总数的5%,$sample执行集合扫描,执行排序,然后选择前N个文档。因此,$sample阶段受以下限制: 如果N小于集合中文
我如何告诉Mongodb在完成查询处理后释放内存?您这样问的原因是因为您不知道操作符是如何工作的。如报告中所述 要获取N个随机文档,请执行以下操作:
- 如果N大于或等于集合中文档总数的5%,$sample执行集合扫描,执行排序,然后选择前N个文档。因此,$sample阶段受以下限制:
- 如果N小于集合中文档总数的5%, 如果使用WiredTiger存储引擎,$sample在集合上使用伪随机光标对N个文档进行采样。 如果使用MMAPv1存储引擎,$sample使用_id索引随机选择N个文档
allowDiskUse
设置为True
collection.aggregate(pipeline, allowDiskUse=True)
原来问题出在存储引擎缓存上。我使用的是EC2实例,它导致了OOM错误。我可以通过分配较小的缓存大小来解决此问题,如下所示:
mongod --dbpath /a/path/to/db --logpath /a/path/to/log --storageEngine wiredTiger --wiredTigerEngineConfigString="cache_size=200M" --fork
您应该将
allowDiskUse
值设置为true
。例如:
db.books.aggregate( [
{ $group : { _id : "$author", books: { $push: "$title" } } },
{allowDiskUse:true}
] )
管道级的RAM限制为100 MB。如果是舞台
如果超过此限制,MongoDB将产生错误。考虑到
处理大型数据集时,请使用allowDiskUse选项启用
将数据写入临时文件的聚合管道阶段
您可以阅读更多信息。谢谢,我尝试过这个,但问题是文件系统缓存大小,默认情况下设置为太大。请查看字段索引,或阅读mongolog以获取COLSCAN信息