2012-06-11 60 views
4

我有一個大的XML文件,我想加載到MySQL。它的大約20 GB未壓縮,但我認爲我可以將其壓縮到原始大小的25%,然後批量上傳到壓縮表。可以加載文件中的數據(mysql bulk uploads)讀取壓縮文件嗎?

我知道我可以壓縮數據庫本身的數據,但它可以在批量添加過程中讀取壓縮文件嗎?

編輯:通過壓縮,我不是說它的.gz.tar文件或任何東西。我的意思是當我用Java或C++創建文件時,我將它輸出爲gzip,所以文件本身是.csv或.xml,並且保留了正確的結構,但其中的每一行都是壓縮的。

如果這是不可能的,我可以做一些類似批量上傳的東西,但不知何故通過一個解壓縮內容的程序來過濾它?我正在考慮用C打開文件並在將它加載到mysql時進行壓縮。問題是我想在批量插入中做到這一點,而不是數百萬個單獨的插入。

回答

7

你應該明確地使用LOAD DATA INFILE這個。插入可能比LOAD DATA INFILE慢一個數量級,特別是在較大的文件上。

不幸的是,MySQL本身不支持直接加載壓縮文件(任何類型,據我所知)。但是,如果您查看上面的LOAD DATA INFILE鏈接,則可以直接從管道將數據加載到表中(只需在頁面中搜索「管道」)即可。我想你可以使用該方法解壓縮文件並將輸出傳輸到MySQL,但壓縮/解壓縮顯然比直接加載未壓縮文件要慢。

+1

謝謝我會測試它,但我認爲這個想法是健全的。從磁盤讀取將是更多的瓶頸,解壓不會。我可以打開文件,解壓縮並打印輸入到mysql的結果。 –

2
$ mkfifo --mode=0666 /tmp/namedPipe 
$ gzip --stdout -d file.gz > /tmp/namedPipe 

然後未壓縮的數據加載到MySQL表所示:

LOAD DATA INFILE '/tmp/namedPipe' INTO TABLE tableName; 
2

,除非你想每隔用戶在系統上,以便能夠不要使用「--mode = -666」寫入管道。使用'--mode = -600',並將管道保存在本地主目錄中以降低未授權訪問的風險。

相關問題