2013-10-10 56 views
0

以下代碼讀取一堆.csv文件,然後將它們合併成一個.csv文件。我試圖system.out.println ...所有數據點都是正確的,但是當我嘗試使用PrintWriter時,得到:如何克服PrintWriter的內存不足異常?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

我試圖使用FileWriter,但得到了同樣的錯誤。我應該如何糾正我的代碼?

public class CombineCsv { 
    public static void main(String[] args) throws IOException { 
     PrintWriter output = new PrintWriter("C:\\User\\result.csv"); 
     final File file = new File("C:\\Users\\is"); 
     int i = 0; 
     for (final File child: file.listFiles()) { 
      BufferedReader CSVFile = new BufferedReader(new FileReader("C:\\Users\\is\\"+child.getName())); 
      String dataRow = CSVFile.readLine(); 
      while (dataRow != null) { 
       String[] dataArray = dataRow.split(","); 
       for (String item:dataArray) { 
        System.out.println(item + "\t"); 
        output.append(item+","+child.getName().replaceAll(".csv", "")+","); 
        i++; 
       } 
       dataRow = CSVFile.readLine(); // Read next line of data. 
      } // Close the file once all data has been read. 
      CSVFile.close(); 
     } 
     output.close(); 
     System.out.println(i); 
    } 
} 

回答

1

我只能想到兩個場景中,該代碼可以導致OOME:

  • 如果file目錄中有一個非常大的數量的元素,然後file.listFiles()可以創建一個非常大的數組File對象。

  • 如果其中一個輸入文件包含非常長的行,則CSVFile.readLine()可能在讀取它的過程中使用大量內存。 (在該行的字節多達6倍。)

解決這兩個問題最簡單的辦法是使用-Xmx JVM選項來增加Java堆大小。


我看不到爲什麼你使用PrintWriter會成爲問題的原因。

+0

謝謝你的回覆。文件數量爲18.每個文件包含30,000條記錄(大約500 Kb) –

+0

18個文件不應該導致問題。記錄的數量也不是問題。我的理論是,問題在於你正在閱讀的文件中有一個包含很長的一行。嘗試找出發生OOME時正在讀取的文件,然後將其縮小到該文件中的一行。 –

+0

謝謝。我試圖使用java -xmx100m,它有幫助 –

0

嘗試

boolean autoFlush = true; PrintWriter output = new PrintWriter(myFileName, autoFlush);

時,有一個新的行或格式化它創建一個PrintWriter實例,它刷新的內容每次。