Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Mongodb聚合内存不足_Python_Mongodb_Pymongo_Aggregation Framework - Fatal编程技术网

Python Mongodb聚合内存不足

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 aggregate从一个大型集合中抽取文档样本

在连续调用了几次之后,我看到mongodb的内存在上升,大约在第12次调用之后,它由于OutOfMemory错误而崩溃


我如何告诉Mongodb在完成查询处理后释放内存?

您这样问的原因是因为您不知道操作符是如何工作的。如报告中所述

要获取N个随机文档,请执行以下操作:

  • 如果N大于或等于集合中文档总数的5%,$sample执行集合扫描,执行排序,然后选择前N个文档。因此,$sample阶段受以下限制:

  • 如果N小于集合中文档总数的5%, 如果使用WiredTiger存储引擎,$sample在集合上使用伪随机光标对N个文档进行采样。 如果使用MMAPv1存储引擎,$sample使用_id索引随机选择N个文档

所以我认为你想要得到的随机文件的数量大于5%。您需要的是将
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信息