在java中将大文件加载到arraylist的最佳方法

时间:2012-12-17 10:58:15

标签: java

我有一个大小约为300mb的文件。我想逐行读取内容,然后将其添加到ArrayList中。所以我创建了一个数组列表a1的对象,然后使用BufferedReader读取文件,之后当我将文件中的行添加到ArrayList时,它会在线程“main”中给出错误异常java.lang.OutOfMemoryError:Java堆空间。

请告诉我这应该是什么解决方案。

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
      FileReader file = new FileReader(
          "/home/dmdd/Desktop/AsiaData/RawData/AllupperairVcomponent.txt");
      ArrayList a1 = new ArrayList();
      BufferedReader br = new BufferedReader(file);
      String line = "";
      while ((line = br.readLine()) != null) {
        a1.add(line);
      }
    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }
  }

7 个答案:

答案 0 :(得分:4)

天真地,通过Xmx命令行参数增加堆的大小(有关指导,请参阅此excellent answer

这只能达到一定程度,而是考虑构建数据,以便最大限度地减少内存需求。你是否一次需要记忆中的所有东西?也许你只需要测试一个项目是否在该集合中,考虑使用散列或布隆过滤器(等)。

答案 1 :(得分:4)

只需增加Java的堆大小

java -Xmx250m

如果您从IDE set -Xmx250m在参数中运行项目。

250m是250mb

答案 2 :(得分:2)

如果您包含在内存中,则可以尝试通过将-mx选项传递给java可执行文件来增加堆大小。

如果您确实需要同时在内存中存储所有数据,那么也可能值得考虑这个问题。可能是您可以按顺序处理它,也可以将大部分或全部保存在磁盘上。

答案 3 :(得分:1)

传递-Xmx1024m以将堆空间增加到1024 mb。

java -Xms1024m -Xmx512m HelloWorld

在32位系统上可以增加4GB,在64位系统上可以增加更多。

答案 4 :(得分:0)

使用java.nio.file.Files.readAllLines,它返回List<String>.如果你让OOME增加堆大小为java -Xmx1024m

答案 5 :(得分:0)

我同意@Murali的一部分,这将解决你所面临的问题。但是建议在处理大文件时使用缓存。如果文件大小在极少数情况下变为500Mb怎么办?使用像Memcached这样的缓存API,这将消除JVM中的内存中断。

答案 6 :(得分:0)

如果可以:批量处理10000行以上的文件。

读取10k行 处理 重复直到完成