2012-11-30 11 views
0

我在寫一個讀取逗號分隔文本文件的Java應用程序,對數據執行一些計算並將更新後的數據寫入新文件。輸入文件包含大約5億行,所以我試圖儘可能擴展下面的內容,以便在運行時不會出現內存不足異常。有關如何改進下面的任何想法?縮放文本文件IO應用程序

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 


public class CsvTest { 

    public void readFile() { 

    BufferedReader br = null; 
    BufferedWriter out = null; 

    try { 

     br = new BufferedReader(new FileReader("C:\\input.txt")); 
     FileWriter fstream = new FileWriter("C:\\output.txt"); 
     out = new BufferedWriter(fstream); 

     String line = null; 

     while ((line = br.readLine()) != null) { 
     out.write(line + "\r\n"); 
     } 
    } 
    catch (FileNotFoundException ex) { 
     System.err.println("Error: " + ex.getMessage()); 
    } 
    catch (IOException ex) { 
     System.err.println("Error: " + ex.getMessage()); 
    } 
    finally { 
     try { 
     if (br != null) { 
      br.close(); 
     } 
     if(out != null){ 
      out.close(); 
     } 
     } 
     catch (IOException ex) { 
      System.err.println("Error: " + ex.getMessage()); 
     } 
    } 
    } 

    public static void main(String[] args) { 
    CsvTest test = new CsvTest(); 
    test.readFile(); 
    } 
} 
+0

您是否收到內存不足錯誤或只是擔心它?如果速度很慢,它可以映射/減少。你看到了什麼具體問題? –

+0

我很關心它,還沒有運行這個龐大的文件... – c12

+1

我的應用程序需要3秒鐘的時間才能使用readFile()方法處理一個137MB的文件,該文件有200萬行。我認爲你的代碼看起來很好,除了需要分離職責(你應該具體的讀寫方法) –

回答

1

你的代碼非常好,我的意思是你將數據從輸入流中輸出到內存中的只有一行,所以就內存要求而言,它基本上是O(1),你不能比我認爲。

相對於多GB文件的大小和內存使用情況,緩衝讀取器和緩衝寫入器中的緩衝區是可以忽略不計的。

編輯:垃圾收集器應該很好地收集未使用的數據,至少我的經驗與它在類似的數據處理情況是相當積極的。

1
out.write(line + "\r\n"); 

可以去爲

out.write(line); 
    out.write("\r\n"); 

如果你處理的細胞,用同一個對象的值,比如字符串,這將是很好的未持有相同的值超過一個對象實例。

private Map<Object, Object> sharedMap = new HashMap<Object, Object>(); 

public Object uniqueObject(Object value) { 
    Object sharedValue = sharedMap.get(value); 
    if (sharedValue == null) { 
     sharedValue = value; 
     sharedMap.put(sharedValue, sharedValue); 
    } 
    return sharedValue; 
}