使用FileReader的BufferedReader会消耗大量内存

4

我在处理非常大的文件(~100g)时使用BufferedReaderFileReader

以下是我使用的代码:

BufferedReader reader = new BufferedReader(new FileReader("file path"));
BufferedWriter writer = new BufferedWriter(new FileWriter("output file"));
String line;
while ((line = reader.readLine()) != null) {
    // check if i need this line, and if i need it, i print it
    writer.write(line);
    writer.newLine();
}
writer.close();
reader.close();
当我在开始时运行我的文件时,它使用的内存很少,但慢慢地使用的内存增长(可以轻松地使用超过50GB的RAM)。 为什么会这样?有没有办法修复它?

2
你对这些行做了什么操作? - Jon Skeet
@JonSkeet 我更新了我的问题。我将每一行按制表符分割(我的文件是制表符分隔的),并检查是否需要这一行,如果需要,我使用BufferedWriter将其打印到输出文件中。 - ldoroni
2
你没有保存任何“部分”吗?如果您能在此处提供一个 [mcve],那将有助于我们尝试重现它。(以及您的文件中大致包含什么内容,这样我们就可以生成类似的东西。) - Jon Skeet
2
50克的RAM?你在那里配置了多少堆?而且你所说的“已使用内存”具体是什么意思? - Marko Topolnik
1
请勿将答案/解决方案编辑到您的问题中,而是创建一个答案帖子。然后不要在标题中写入“已解决”,而是接受解决您问题的答案。并且解释一下您如何使用-Xmx参数。也许传递的值设置不正确。 - Tom
显示剩余6条评论
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
0

我发现当我在Linux命令行上使用-Xmx参数运行Java程序时,出于某种原因,我的Java程序需要占用大量的RAM。

当我删除-Xmx参数时,Java程序使用的内存较低。


这是我的旧命令:

java -Xmx350g -jar MyJar.jar

这是我的新命令:

java -jar MyJar.jar

我甚至不知道将350g分配给JVM是可能的... 另外,也许垃圾收集器只有在占用一定比例的空间后才会启动? - Asoub
1
@Asoub 我在一台强大的服务器上运行它,所以当你有512G的内存时,分配350G不应该是问题。我认为你可能对垃圾回收器是正确的,但我并不确定。 - ldoroni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,