3

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

请告诉我应该如何解决这个问题。

  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();
    }
  }
4

7 回答 7

4

天真地,通过 Xmx 命令行参数增加堆的大小(有关一些指导,请参阅这个出色的答案)

不过,这只会在一定程度上起作用,而是考虑构建数据以最小化内存需求。您是否需要一次将所有内容都保存在内存中?也许您只需要测试一个项目是否在该集合中,考虑使用散列或布隆过滤器(等)。

于 2012-12-17T11:00:12.377 回答
4

只是增加Java的堆大小

java -Xmx250m

如果您从 IDE 运行项目,请在参数中设置 -Xmx250m。

250m 就是 250mb

于 2012-12-17T11:02:26.687 回答
2

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

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

于 2012-12-17T10:59:59.567 回答
1

通过 -Xmx1024m 将堆空间增加到 1024 mb。

java -Xms1024m -Xmx512m HelloWorld

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

于 2012-12-17T11:00:37.507 回答
0

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

于 2012-12-17T11:05:42.500 回答
0

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

于 2012-12-17T11:03:01.287 回答
0

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

读取 10k 行过程重复直到完成

于 2012-12-17T11:15:10.987 回答