gpt4 book ai didi

java - 我读取大文本文件的 Java 程序内存不足,谁能帮忙解释一下原因?

转载 作者:太空狗 更新时间:2023-10-29 22:58:46 25 4
gpt4 key购买 nike

我有一个包含 2000 万行文本的大型文本文件。当我使用以下程序读取文件时,它工作得很好,事实上我可以读取更大的文件而没有内存问题。

public static void main(String[] args) throws IOException {
File tempFile = new File("temp.dat");
String tempLine = null;
BufferedReader br = null;
int lineCount = 0;
try {
br = new BufferedReader(new FileReader(tempFile));
while ((tempLine = br.readLine()) != null) {
lineCount += 1;
}
} catch (Exception e) {
System.out.println("br error: " +e.getMessage());
} finally {
br.close();
System.out.println(lineCount + " lines read from file");
}
}

但是,如果我需要在读取该文件之前将一些记录附加到该文件,BufferedReader 会消耗大量内存(我刚刚使用 Windows 任务管理器对此进行了监控,我知道这不是很科学,但它证明了问题所在)。修改后的程序如下,与第一个程序相同,只是我先将一条记录附加到文件。

public static void main(String[] args) throws IOException {
File tempFile = new File("temp.dat");
PrintWriter pw = null;
try {
pw = new PrintWriter(new BufferedWriter(new FileWriter(tempFile, true)));
pw.println(" ");
} catch (Exception e) {
System.out.println("pw error: " + e.getMessage());
} finally {
pw.close();
}

String tempLine = null;
BufferedReader br = null;
int lineCount = 0;
try {
br = new BufferedReader(new FileReader(tempFile));
while ((tempLine = br.readLine()) != null) {
lineCount += 1;
}
} catch (Exception e) {
System.out.println("br error: " +e.getMessage());
} finally {
br.close();
System.out.println(lineCount + " lines read from file");
}
}

Windows 任务管理器的屏幕截图,其中线条中的大凸起显示我运行程序的第二个版本时的内存消耗。

task manager screenshot

所以我能够在内存不足的情况下读取这个文件。但是我有超过 5000 万条记录的更大文件,当我对它们运行这个程序时遇到内存不足异常?有人可以解释为什么程序的第一个版本在任何大小的文件上都能正常工作,但第二个程序的行为却如此不同并以失败告终吗?我在 Windows 7 上运行:

Java 版本“1.7.0_05”
Java(TM) SE 运行时环境 (build 1.7.0_05-b05)
Java HotSpot(TM) 客户端 VM(build 23.1-b03,混合模式,共享)

最佳答案

您可以使用 VM-Options 启动 Java-VM

-XX:+HeapDumpOnOutOfMemoryError

这会将堆转储写入文件,可以对其进行分析以查找泄漏嫌疑人

使用“+”添加选项,使用“-”删除选项。

如果您使用 Eclipse,Java 内存分析器插件 MAT从运行的 VM 中获取堆转储,并对泄漏嫌疑人等进行一些不错的分析。

关于java - 我读取大文本文件的 Java 程序内存不足,谁能帮忙解释一下原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12202313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com