提问者:小点点

使用扫描仪将大文件读入内存的内存不足


当我将大文件传递到扫描仪时,以下代码块抛出java. lang.OutOfMemoryError异常。解决此问题的最佳方法是什么?问题是在数组列表中还是在扫描仪中?

ArrayList rawData = new ArrayList();
Scanner scan = new Scanner(file);

while (scan.hasNext()) {
    String next = scan.next();
        rawData.add(next);
}

共3个答案

匿名用户

增加 Java 堆大小,例如

java -Xmx6g myprogram

将堆大小设置为6 GB。当然总会有限制……

匿名用户

主要问题是存储在数组列表中。此外,请尝试使用bufferReader,只在while语句内部进行处理,而不是尝试将其添加到arraylist中。这里有一个简单的例子。

        File file = new File("C:\\custom_programs\\reminder_list.txt");
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line;
        while ((line = br.readLine()) != null) {
            // do something with line.
            System.out.println(line);
        }
        br.close();

匿名用户

与其将文件中的所有行加载到ArrayList中,不如在读取每条记录后立即对其执行所需的操作。如果堆大小不够大,将整个文件加载到内存中会导致OOM问题。

Scanner scan = new Scanner(file);
while (scan.hasNext()) {
    String next = scan.next();
    //do what you want to do on next
}