2012-04-27 69 views
3

將80GB的XML數據導入MySQL需要超過5天才能完成?將數據從XML文件批量加載到MySQL

我目前正在導入XML文件,該文件是大約80GB的大小,我正在使用的代碼是在這個gist,雖然一切正常,它已經運行了近5天連續和它甚至還沒有接近被做...

平均表的大小大致是:

Data size: 4.5GB 
Index size: 3.2GB 
Avg. Row Length: 245 
Number Rows: 20,000,000 

讓我知道,如果需要更多的信息!

服務器規格:

注意這是一個的Linode VPS

英特爾®至強®處理器L5520 - 四核 - 2.27GHZ 4GB的RAM總量

XML示例

https://gist.github.com/2510267

謝謝!


研究更多關於這件事情,這似乎是平均後,我發現這個answer描述的方式來提高進口率。

+2

你有沒有試過分析你的代碼,看看時間在哪裏? – eggyal 2012-04-27 14:21:34

+0

您可能會嘗試更改事務日誌,因此它不會讓事情陷入癱瘓:http://stackoverflow.com/questions/996403/disable-transaction-log – 2012-04-27 14:23:56

+1

您是否在小測試中嘗試了您的代碼以確保其正常工作? – 2012-04-27 14:24:06

回答

2

有一件事會幫助你做很多事情,而不是每次一次提交。我建議從幾百行開始一次提交,然後從那裏調整。

此外,你現在正在做的事情你做一個存在檢查 - 轉儲;這大大增加了您需要運行的查詢數量。相反,使用ON DUPLICATE KEY UPDATE(MySQL擴展,不符合標準)使重複INSERT自動執行正確的操作。

最後,考慮構建工具以將XML從文本轉換爲適用於mysqlimport工具的文本格式,然後使用該批量加載器替代。這將徹底地將XML解析所需的時間與數據庫所需的時間分開,並且還可以使用專爲此目的設計的工具(而不是使用INSERTUPDATE命令,mysqlimport使用專用的LOAD DATA INFILE擴展名)來加快數據庫導入本身的速度。

+0

啊一個bug,謝謝你!存在檢查應該根據從工具的最新更新中錯誤修剪的導入類型排除,我還將研究mysqlimport工具。 – Nick 2012-04-27 16:10:36

+0

將它標記爲已接受,因爲發現了一個錯誤並提供了有助於提高性能的提示:) – Nick 2012-05-01 15:22:31

0

這(可能)與您的速度問題無關,但我會建議仔細檢查iterparse的行爲是否符合您的邏輯。在開始事件發生的時候,它可能會或可能不會加載節點的文本值(取決於是否發生在適合它解析的數據塊內),所以你可以得到一些相當隨機的行爲。

0

我有3個快速suggesstions使沒有看到你的代碼嘗試類似的東西

  1. 優化代碼爲高性能後High-performance XML parsing in Python with lxml 是一個偉大的文章來看看。
  2. 考慮pypy
  3. 重新編寫代碼,以利用多個CPU其中的蟒蛇不會做本身

極大地做這些事情,提高一個類似的項目我工作的速度。 也許如果您發佈了一些代碼和示例xml,我可以提供更深入的解決方案。 (編輯,對不起錯過了要點......)

+0

該代碼張貼在一個要點中,我在該問題的第二句中引用了一個鏈接。我已經閱讀過文章#1,並且系統正在四核上運行,它已經相當均勻地均勻分佈mysql/python的負載,所以重寫利用多核心真的有幫助嗎? – Nick 2012-04-27 15:27:14

+0

是的,我很抱歉,我會仔細查看要點。 – matchew 2012-04-27 15:27:49