2014-02-16 59 views
3

我有一些大的XML文件(5GB〜每個),我正在導入到一個mongodb數據庫。我使用Expat來解析文檔,進行一些數據操作(刪除一些字段,單位轉換等),然後插入到數據庫中。我的腳本是基於這一個:https://github.com/bgianfo/stackoverflow-mongodb/blob/master/so-import如何提高到mongodb的XML導入?

我的問題是:有沒有一種方法來改善這與批量插入?在插入前將這些文檔存儲在數組中會是一個好主意?那麼在插入之前我應該​​存儲多少個文檔?將jsons寫入一個文件然後使用mongoimport會更快?

我欣賞任何建議。

回答

1

在插入之前將這些文檔存儲在數組上將是一個好主意?

是的,很有可能。它減少了往返數據庫的次數。你應該監視你的系統,由於IO等待(也就是說,開銷和線程同步比實際的數據傳輸需要更多的時間)插入時可能會怠速很多。

插入前應存儲多少個文檔?

這很難說,因爲它取決於很多因素。經驗法則:1,000 - 10,000。你將不得不嘗試一點。在較早版本的mongodb中,整個批次不得超過16MB的文檔大小限制。

將jsons寫入文件,然後使用mongoimport會更快?

不,除非你的代碼有缺陷。這意味着你必須複製數據兩次,整個操作應該是IO綁定。

此外,這是一個好主意,先添加的所有文件,然後添加任何索引,而不是其他的方式(因爲那麼指數將不得不與每個插入被修復)

+0

感謝您的快速響應!我現在開始用數組大小​​開始「試驗」:) –

3

如果你想導入XML來的MongoDB和Python正是你到目前爲止選擇得到這份工作做,但你是開放的進一步靠近,然後還可以通過以下步驟執行此:

  1. transforming the XML documents to CSV documents using XMLStarlet
  2. transforming the CSVs to files containing JSONs using AWK
  3. 導入JSON文件的MongoDB

XMLStarlet和AWK都非常快,你可以使用一個不平凡的結構(子對象,數組)來存儲您的JSON對象。


http://www.joyofdata.de/blog/transforming-xml-document-into-csv-using-xmlstarlet/ http://www.joyofdata.de/blog/import-csv-into-mongodb-with-awk-json/