1
我爲我的應用程序中的離線報告編寫了一個大型的大約1200(+/- 200)mb的csv文件。 (一個線程執行這項工作。)數據計數可能大約爲5000萬,所以查詢每運行50k行。查詢循環運行直到空提取(針對給定條件)。要將數據寫入文件,而不是使用Java流,我嘗試了nio。花了我大約12秒才寫出一條有50000行的巨大字符串。用BufferedWriter嘗試的相同代碼需要約18-22秒。下面給出了nio方法的代碼。我想知道這是否是直接用nio編寫大文件的方法?任何我忽略的東西,錯過了?任何其他方式,優化和代碼改進是值得歡迎的。用NIO寫一個大文本文件
private static void writeData(FileChannel channel, String data) {
ByteBuffer buffer = null;
try {
buffer = Charset.forName("UTF-8").encode(
CharBuffer.wrap(data.toCharArray()));
channel.write(buffer);
} catch (Exception e) {
e.printStackTrace();
}
}
private String writeReport() {
try {
FileOutputStream out = new FileOutputStream(pathToFile, true);
FileChannel channel = out.getChannel();
// db query
while(iterate resultset) {
// get row result
writeData(channel, data);
}
} catch(Exception e){
//log
} finally {
channel.close();
out .close();
}
}
//pseudo code with bufferedwriter
private String writeReport(Resultset rs, String file) {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(file), 1024 * 10);
int headerCount = 0;
while(rs.next()) {
String col1 = rs.getString(1);
String col2 = rs.getString(2);
String col3 = rs.getString(3);
String col4 = rs.getString(4);
String col5 = rs.getString(5);
String colN= rs.getString(n); //nth column
if(headerCount==0) {
writeHeader(writer);
headerCount++;
}
if(col1.equals(condition1)) {
writer.append(col1).append(",");
}
......
if(colN.equals(conditionN)) {
writer.append(colN).append(",").append(newLine());
}
}
} catch(Exception e){
//log
} finally {
writer.close();
}
}
我現在用BufferedWriter運行測試,平均花費18-22秒來寫相同。我重新運行測試,因爲我失去了早期的測試結果。方法1,我將結果存儲在一個StringBuilder中,並在迭代結束時寫入BufferedWriter。 (我有內存異常,所以重寫了方法2)。方法2,我從行結果中形成一個字符串,並寫入BufferedWriter,進行更多的磁盤寫操作,結果爲18秒。方法3,我有一個最佳計數,我在迭代時檢查,當達到(然後重置)時寫入BufferedWriter,導致約20秒。 –
@VijayVeeraraghavan緩衝寫入器的全部重點是將多個寫入緩衝到一個寫入中,這意味着直接寫入到BufferedWriter的速度應該比寫入到稍後複製到BufferedWriter的StringBuilder的寫入速度快。 –
請告訴我們,如果您將writeData()調用註釋掉需要多長時間。所以我們知道需要多少時間來獲取所有數據並通過它。 – Ingo