我正在使用mongodb聚合來從大集合中對文檔進行採樣。Mongodb聚合內存不足
https://docs.mongodb.com/manual/reference/operator/aggregation/sample/
使得連續幾個電話後,我看到的MongoDB爬上內存,並圍繞12日通話後,將其與內存不足錯誤崩潰。
如何告訴Mongodb在完成處理查詢後釋放內存?
我正在使用mongodb聚合來從大集合中對文檔進行採樣。Mongodb聚合內存不足
https://docs.mongodb.com/manual/reference/operator/aggregation/sample/
使得連續幾個電話後,我看到的MongoDB爬上內存,並圍繞12日通話後,將其與內存不足錯誤崩潰。
如何告訴Mongodb在完成處理查詢後釋放內存?
你問這個問題的原因是因爲你不知道$sample
操作員是如何工作的。正如在documentation提到的,
爲了獲得N個隨機文件:
如果N是大於或等於該集合中的總文件的5%,$樣品進行收集掃描,執行排序,然後選擇前N個文檔。因此,$ sample階段受制於sort memory restrictions。
如果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
謝謝,我試過這個,但事實證明問題是文件系統緩存大小,它被設置爲太大默認。 – siamii