2012-11-04 137 views
1

Im試着將mysql表遷移到mongodb。我的表有600萬條記錄。我用morphia使用java。當我節約大約1,200萬美元時,我的記憶幾乎全部消耗完了。MongoDB使用大量內存

我讀過mongo將數據存儲在內存中並保存在磁盤中之後。是否有可能發送類似提交的內容來釋放一些內存?

+2

mongodb使用多少內存?我不覺得它使用大量不需要的內存。通常它是根據需要在內存中緩存的數據和索引,它使用最多的內存。 –

+0

我的個人電腦有6GB,當一個開始進程即時消息使用約1,5GB。 1.5百萬條記錄後,使用的內存是5,80GB。即時通訊使用Windows,並在這個時候操作系統彈出我說,一些進程正在使用大量的內存,必須關閉或數據將丟失。 – ulima69

+0

coll名稱未壓縮,因此使用名稱(如userdata.timestampuser或userdata.longnameforfield)不是最佳選擇。嘗試更改名稱eq時間戳使用ts,user_id => ui或uid – user956584

回答

1

1)就耐用性而言,您可以告訴MongoDB java驅動程序(Morphia正在使用哪種策略),請參閱https://github.com/mongodb/mongo-java-driver/blob/master/src/main/com/mongodb/WriteConcern.java#L53。這僅僅是速度之間的一種折衷:NONE(連連接問題都不會導致錯誤)高達FSYNC_SAFE(數據肯定寫入磁盤)。 對於內部細節退房http://www.kchodorow.com/blog/2012/10/04/how-mongodbs-journaling-works/

2)你的整個數據被映射到內存(這就是爲什麼32位版本有2GB的大小限制),但它是唯一的實際加載,需要時。 MongoDB通過使用mmap將其留給操作系統。所以只要有更多的RAM可用,MongoDB會很高興地將所有需要的數據加載到RAM中,以便快速查詢。如果沒有更多的內存可用,則取決於操作系統來更換舊的東西。這具有很好的效果,即使您重新啓動MongoDB進程,數據也會保存在內存中;僅當您重新啓動服務器時,必須再次從磁盤提取數據。我認爲缺點是數據庫進程可能比對操作系統更好地理解應該先交換的內容。 我沒有在Windows上使用MongoDB,在Mac或Linux(還)上沒有看到該消息,但操作系統應該爲您處理(並根據需要自動更換信息)。你有沒有嘗試將驅動程序設置爲JOURNAL_SAFE(應該是數據安全性和速度之間的良好折衷)?在這種情況下,即使MongoDB進程死亡,也不會丟失數據。

3)一般來說,MongoDB的構建目的是儘可能多地使用可用內存,但您可以使用http://captaincodeman.com/2011/02/27/limit-mongodb-memory-use-windows/(我沒有測試過)來限制它,因爲我們使用的是(虛擬)Linux服務器。

+0

誰限制內存和Cpu真棒我需要試試:) – user956584

0

,如果你只是想釋放一些內存MongoDB使用,您的數據進行處理和mongod的空閒後,您可以運行此命令

use admin 
db.runCommand({closeAllDatabases: 1}) 

那麼,你會看到映射的vsize,資源是outputed由mongostat下跌了很多。

我有嘗試,它的工作原理。希望有所幫助,^ _^