2017-04-25 57 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

我不知道老兄 –

相关问题