2014-03-29 53 views
3

根據聚合管道文檔, 「任何單個聚合操作消耗的系統RAM超過10%,操作將產生錯誤。」 - http://docs.mongodb.org/manual/core/aggregation-pipeline-limits/增加mongodb聚合作業的內存限制

有沒有什麼辦法增加這個限制?我還設置了allowDiskUse:true(因此錯誤不再是問題),但想要使用更多RAM來提高性能。

背景: 我在約1億條條目上運行MongoDB上的大型聚合作業。基本上,對$ group進行大規模調用以基於密鑰合併條目。

我使用蒙戈v 2.6.0-RC2(2014年3月21日)

+0

我不相信目前有,你可以嘗試寫出一個可以「欺騙」限制的集合 – Sammaye

回答

4

哦,不,沒有設定的開發版,如果你真的想它有這個很好的理由。因此,如果你首先考慮什麼是聚合,MongoDB通常會做些什麼,這應該會變得很清楚。

這是「應該」是在任何明智的聚集管道的 「頭」 是什麼:

db.collection.aggregate([ 
    { "$match:{ /* Something here */ } }, 

而這些都是原因:

  1. 它使好感嘗試以減少您正在操作的工作集任何操作。

  2. 這也是只有當你有機會使用索引來幫助搜索選擇。這是總是比收集掃描更好。

  3. 即使有一個內置的「優化」,看起來這樣的事情,「預測」限制「選中」域,工作集大小的最佳監票是工作的有效記錄。後一階段的比賽都沒有以這種方式「優化」。(見點)

接下來的事情要考慮的是MongoDB中的一般行爲。因此,服務器進程希望做的,是「消費」可用機器內存的多少,因爲它可以爲了保持「工作集」數據(包括集合和/或指數)以「工作」關於該數據的最有效的方法是

所以真的是在「最佳利益」的數據庫引擎「花」 它的內存分配的這種方式。正如那樣,您的「聚合」作業和所有的其他並行進程都可以訪問內存空間中的「工作數據」。從其他併發操作

因此,它是MongoDB的「不是最佳的」「偷」這個內存分配僅有來服務你的跑步聚合操作。

「編程到硬件要求」條款,以及你知道未來版本允許聚合管道實現「磁盤使用」,以便允許更大的處理。您始終可以實施SSD或其他快速存儲技術。當然,RAM的「10%」對安裝在系統中的RAM數量是主觀的。所以你可以隨時增加那。

這樣做的綜述是,MongoDB的具有作爲「並行數據倉庫」實際工作和不那麼好。它是什麼不是特定「聚合工作運行員」,不應該這樣對待。

因此,無論「分手」您的工作負載,或增加您的硬件規格,或者簡單地切換大「任務中運行」活動的東西,確實專注於正在運行的作業,如的Hadoop風格的「mapReduce」,並將MongoDB保留爲服務數據的作業

當然還是,「寫」地方您的設計更改爲簡單「預聚合」所需的數據。

俗話說,「馬的課程」,或使用的工具是什麼,他們設計

+1

對我來說,這個內存限制是相當隨心所欲和阻礙的。我在一個有大量文檔的DB上運行一個聚合(預計會增長到大約4.5億),並且必須定期運行返回數百萬個文檔的查詢。這樣可以運行大約8GB的內存,所以100MB的容量太低,實際上只是一個任意值。 –