2017-04-25 56 views
-1

我有一個包含1億條記錄的文本文件。我使用非常古老的方式來閱讀文件,但它花了很長時間,無法完成,因爲內存不足的問題。我很感激,如果你能推薦使用Java或使用任何外部庫讀取文件最好和最佳的方式。(最終的解決辦法應減少消耗的時間)這是我的代碼,我上面所解釋的,什麼是使用java讀取文件的最有效方式?

BufferedReader reader = null; 

    List<String> fileLines = new ArrayList<String>(); 
    String line = ""; 
    reader = new BufferedReader(new java.io.FileReader(file)); 
    while ((line = reader.readLine()) != null) { 
     fileLines.add(line); 
    } 
    reader.close(); 
    return fileLines; 

還用另一種方式,但結果是一樣的。

public static void fileReading(File file, Object executingClass, String methodName, int size) throws IOException { 
    try { 
     Method method = executingClass.getClass().getMethod(methodName, List.class); 

     BufferedReader reader = null; 

     List<String> fileLines = new ArrayList<String>(); 
     String line = ""; 
     reader = new BufferedReader(new java.io.FileReader(file)); 
     int track = 0; 
     while ((line = reader.readLine()) != null) { 
      track++; 
      fileLines.add(line); 

      if (0 == track % size) { 
       method.invoke(executingClass, fileLines); 
       fileLines.clear(); 
      } 
     } 

     if (!fileLines.isEmpty()) { 
      method.invoke(executingClass, fileLines); 
      fileLines.clear(); 
     } 

     reader.close(); 


    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 
} 
+3

嘗試處理記錄一前一後,不保存所有的人。 – Berger

+1

您正試圖通過將每個行添加到列表中來將整個文件讀入內存。 Java的JVM默認有1GB的限制(儘管你可以增加它)。你爲什麼不能一次讀出每一行,做任何你需要的處理然後把它扔掉? – Michael

+0

我已更新我的問題,請參閱。通過使用我的新方法,我一次獲得1000個字符串列表並處理它。 –

回答

1

你有兩種選擇:

1 - 最好,不讀取整個文件並將其存儲在內存中。只讀一行(或一組代表一個條目的行),處理它,然後對文件中的所有行重複它。

2 - 如果您確實需要將整個文件存儲在內存中,請嘗試增加JVM堆的大小。

+1

「如果您確實需要將整個文件存儲在內存中......」,請修改您的算法,因爲沒有您的算法。 – Michael

-1

嘗試通過傳遞以下參數擴大分配給JVM在Java內存:

-Xms=3000m -Xmx=5000m 

m表示MIB。 GiB也可以使用g

http://www.rgagnon.com/javadetails/java-0131.html

+0

你應該這樣做,如果你必須。他可能不需要。 – Michael

+0

我不知道老兄 –

相關問題