2013-12-10 45 views
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(); 
    } 
} 

回答

2

寫您的文件很可能是一個BufferedWriter.如果是緩慢的我希望看到你的代碼的最快方法。不應期望NIO在這裏提供任何令人吃驚的東西,並且您發佈的代碼肯定不會比BufferedWriter,更快,因爲它會進行更多的物理寫入。

+0

我現在用BufferedWriter運行測試,平均花費18-22秒來寫相同。我重新運行測試,因爲我失去了早期的測試結果。方法1,我將結果存儲在一個StringBuilder中,並在迭代結束時寫入BufferedWriter。 (我有內存異常,所以重寫了方法2)。方法2,我從行結果中形成一個字符串,並寫入BufferedWriter,進行更多的磁盤寫操作,結果爲18秒。方法3,我有一個最佳計數,我在迭代時檢查,當達到(然後重置)時寫入BufferedWriter,導致約20秒。 –

+2

@VijayVeeraraghavan緩衝寫入器的全部重點是將多個寫入緩衝到一個寫入中,這意味着直接寫入到BufferedWriter的速度應該比寫入到稍後複製到BufferedWriter的StringBuilder的寫入速度快。 –

+0

請告訴我們,如果您將writeData()調用註釋掉需要多長時間。所以我們知道需要多少時間來獲取所有數據並通過它。 – Ingo

相關問題