2012-07-04 118 views
37

我需要將66億個bigrams加載到集合中,但我找不到任何有關此操作最佳方法的信息。MongoDB:集合中的所有文檔

將很多文檔加載到單個主鍵索引上將會花費很長時間,但據我所知,mongo不支持相當於分區?

分割會有幫助嗎?我應該嘗試將數據集分成多個集合並將該邏輯構建到我的應用程序中?

+3

看看我的這個回答可以幫助你:http://stackoverflow.com/問題/ 6783212 /如何對負載100百萬記錄 - 到 - MongoDB的與 - 斯卡拉按績效-TE sting/6786925#6786925 – DhruvPathak

回答

46

很難說什麼是最佳批量插入 - 這部分取決於您插入的對象的大小以及其他不可估量的因素。你可以嘗試一些範圍,看看什麼給你最好的表現。作爲替代,一些人喜歡使用mongoimport,這很快,但是您的導入數據需要是json或csv。如果數據是BSON格式,顯然有mongodrestore。

Mongo可以輕鬆處理數十億個文檔,並且可以在一個集合中擁有數十億個文檔,但請記住maximum document size is 16mb。 MongoDB中有很多人擁有數十億的文檔,並且在MongoDB Google User Group上有很多關於它的討論。如果您改變主意並希望擁有多個收藏集,請使用大量您可能喜歡閱讀的收藏集,這裏有一個document。你有更多的收藏品,你也會有更多的索引,這可能不是你想要的。

這是Craigslist的presentation關於將數十億個文檔插入MongoDB和該文檔的blogpost

它確實看起來像分片將是一個很好的解決方案,但通常分片用於擴展多臺服務器和很多民間人士這樣做,因爲他們想要擴大他們的寫作或他們無法保持其工作集(數據和索引)在RAM中。從一臺服務器開始,然後隨着數據增長或移動到分片或副本集合,或者需要額外的冗餘和彈性,這是完全合理的。

但是,還有其他用戶使用多個mongods來解決大量寫入的單個mongod的鎖定限制。這很明顯,但仍值得一說,但與單一服務器相比,multi-mongod設置的管理更爲複雜。如果你的IO或cpu沒有超出這裏,你的工作集比RAM小,你的數據很容易保持平衡(非常隨機分佈),你應該看到改進(在單個服務器上分片)。作爲參考,存在內存和IO競爭的可能性。 2.2的改進concurrencydb locking,我懷疑這樣的部署將有更少的原因。

您需要計劃好正確的分步棋步,即仔細考慮選擇分片鍵。如果你這樣做,那麼最好預先拆分並關閉平衡器。要移動數據以保持平衡,這意味着您需要決定如何分割數據,這將會起到反作用。此外,設計文檔時有時很重要,即將某些字段用於分片或作爲主鍵。

下面是一些很好的聯繫 -

+1

如果您正在反覆處理大量數據(如您所建議的數據),那麼在任何數據庫(包括其他大型數據庫解決方案)中都會很慢。 –

+0

沒有@ChrisHoughton,mysql innodb引擎可以快速插入/選擇超過65億條記錄,當然還有複合索引和分區。但是,當我在10億條記錄中嘗試了mongodb時 - 尤其是對於聚合函數而言,它非常有用。 –

7

你絕對可以shard data in MongoDB(它分割在shard key的N個服務器上)。事實上,這是它的核心優勢之一。在您的應用程序中沒有必要這樣做。

對於大多數使用情況,我強烈建議爲66億份文檔做這件事。根據我的經驗,MongoDB在一些中檔服務器上表現更好,而不是一個大型服務器。

+1

這僅適用於單個服務器。即使說創建4個碎片仍然會保留數十億條記錄... –

+0

至少當我在6個月前使用大容量MongoDB時,鎖定非常不理想。即使你的碎片位於同一臺物理服務器上,你可能會發現在服務器上運行多個MongoDB實例的性能會更好(然後再次,我認爲這種配置是官方支持的)。基準你的用例。 –

+3

另外...如果您沒有足夠的RAM來將工作集(經常訪問的文檔)保留在內存中,則Mongo性能會下降(相對)。請注意這一點。 –

相關問題