【问题标题】:How to deal with a "java.lang.OutOfMemoryError: Java heap space" error when reading a file? [duplicate]读取文件时如何处理“java.lang.OutOfMemoryError: Java heap space”错误? [复制]
【发布时间】:2021-01-15 08:00:54
【问题描述】:

我有以下代码用于读取大约 300MB 大小的文件,执行被“java.lang.OutOfMemoryError: Java heap space”异常中断:

import java.io.*;
import java.util.*;
 
class MainClass {
   static ArrayList<String> getAttribute(String str) {
      if(str==null) return null;      
      ArrayList<String> a = new ArrayList<>();
      int i = 0;
      int j = -1;
      while(i<str.length() && j<str.length()) {
         j = str.indexOf(',',i);
         if(j==-1) j = str.length();   
         a.add(str.substring(i,j));
         i = str.indexOf(',',j)+1;
      }      
      return a;
   }
   
   static ArrayList<ArrayList<String>> readFile(String in) throws IOException {
      ArrayList<ArrayList<String>> a = new ArrayList<>();
      try(FileInputStream fin = new FileInputStream(in);) {         
         BufferedReader br = new BufferedReader(new InputStreamReader(fin));
         String str = br.readLine();
         while(str!=null) {
            a.add(getAttribute(str));
            str = br.readLine(); //line 26
         }
      }
      return a;
   }   
   
   public static void main(String args[]) throws IOException
   {      
      readFile("stats1.csv"); //line 34
   }
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at MainClass.readFile(MainClass.java:26)
        at MainClass.main(MainClass.java:34)

这个错误的原因是什么?还是只是文件太大?

【问题讨论】:

  • 你能添加完整的堆栈跟踪吗?哪条线路会导致问题?
  • @flaxel 好的,我更新了 stracktrace 和行号。
  • 嗯,你正在读取内存中的整个文件,这最终会爆炸。而是逐行加载和解析文件。它可能会更快,文件大小突然不再重要了。
  • "这个错误的原因是什么?还是只是文件太大了?"那么,你能用一个小文件重现错误吗?
  • @M.Deinum 感谢您的回复。我实际上被要求这样做,将整个文件复制到一个二维 ArrayList 中。

标签: java


【解决方案1】:

查看ArrayList 类的不带参数的默认构造函数的源代码。它创建一个大小为 10 的数组。然后查看ArrayList类中方法add()的源代码。一旦添加了十个元素,就需要增加数组。它增加了一半。换句话说,当您添加第 11 个元素时,数组的大小会增加到 15。当您添加第 16 个元素时,数组会增加到 22,依此类推。一旦获得大数字,添加单个元素将导致数组大小大幅增加。因此建议使用接受初始容量参数的ArrayListconstructor。因此,也许您可​​以计算文件中的行数,以了解您的ArrayList 需要多少容量。请参阅 SO 问题 Java NIO Files count() Method for Counting the Number of Lines 了解一种计算文件行数的方法。

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2018-07-24
    • 1970-01-01
    • 2013-06-20
    • 2018-07-04
    相关资源
    最近更新 更多