2010-01-07 52 views
6

問候, 我從數據庫中獲取大量記錄並寫入到一個文件中。我想知道寫入大文件的最佳方式是什麼。 (1Gb-10Gb)。java:寫大文件?

目前我使用的BufferedWriter

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV)); 
while(done){ 
//do writings 
} 
mbrWriter.close(); 
+1

對我來說看起來很合理(除了隨機選擇一個字符集並關閉finally塊中的底層流)。性能問題可能與磁盤寫入數據的速度有關(可能需要重新讀入)。 – 2010-01-07 02:42:41

+1

(或在該數據庫中併發,爲連接設置隔離級別,也許設置獲取大小。) – 2010-01-07 02:43:53

回答

9

如果你真的堅持使用Java這一點,那麼最好的辦法是作爲數據進來,立即儘快寫,因而不能亂所有將來自ResultSet的數據首先轉換爲Java的內存。否則,您至少需要Java中的大量可用內存。

因此,

while (resultSet.next()) { 
    writer.write(resultSet.getString("columnname")); 
    // ... 
} 

這就是說,最體面的DB的船舶與作爲undoubtely方式更有效的比你所能做到在Java中內置出口到CSV能力。你沒有提及你正在使用哪一個,但是如果它是例如MySQL,那麼你可以使用LOAD DATA INFILE這個。只需參閱特定於數據庫的文檔。希望這給了新的見解。

4

BufferedWriter的默認緩衝區大小是8192.如果您打算編寫squigabyte文件,則可能需要使用2參數構造函數來增加此值;例如

int buffSize = ... // 1 megabyte or so 
BufferedWriter mbrWriter = new BufferedWriter(new FileWriter(memberCSV), buffSize); 

這應該會減少寫入文件所需的系統調用次數。

但我懷疑這會造成超過百分之幾的差異。從結果集拉行可能會成爲主要的性能瓶頸。爲了顯着提高性能,您需要使用數據庫的本地批量導出設施。

0

林不是100%肯定,但它似乎是BufferedReader加載到RAM中的緩衝區中的數據。 Java可以使用128mb Ram(除非另有說明),所以BufferedReader可能會溢出java的內存導致錯誤。嘗試使用InputStreamReader和FileInputStream讀取數據並將其存儲在char中,然後使用FileOutputStream編寫該char。