2016-10-08 77 views

回答

1

你問這個問題的原因是因爲你不知道$sample操作員是如何工作的。正如在documentation提到的,

爲了獲得N個隨機文件:

  • 如果N是大於或等於該集合中的總文件的5%,$樣品進行收集掃描,執行排序,然後選擇前N個文檔。因此,$ sample階段受制於sort memory restrictions

  • 如果N小於集合中文檔總數的5%, 如果使用WiredTiger存儲引擎,則$ sample在集合上使用僞隨機遊標來對N個文檔進行採樣。 如果使用MMAPv1存儲引擎,$ sample使用_id索引隨機選擇N個文檔。

所以我想你想獲得隨機文件的數量是大於5%。你需要的是allowDiskUseTrue

collection.aggregate(pipeline, allowDiskUse=True) 
+0

謝謝,我試過這個,但事實證明問題是文件系統緩存大小,它被設置爲太大默認。 – siamii

0

事實證明問題是存儲引擎緩存。我正在使用EC2實例,並導致出現OOM錯誤。我已經能夠解決它通過分配這樣一個較小的緩存大小:

mongod --dbpath /a/path/to/db --logpath /a/path/to/log --storageEngine wiredTiger --wiredTigerEngineConfigString="cache_size=200M" --fork