gpt4 book ai didi

java - Java读取大文件——Java堆空间

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:01:42 26 4
gpt4 key购买 nike

我正在读取一个大的 tsv 文件 (~40G) 并尝试通过逐行读取来修剪它并仅将某些行打印到新文件中。但是,我不断收到以下异常:

java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2894)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:117)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:532)
at java.lang.StringBuffer.append(StringBuffer.java:323)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at java.io.BufferedReader.readLine(BufferedReader.java:379)

下面是代码的主要部分。为了以防万一,我将缓冲区大小指定为 8192。一旦达到缓冲区大小限制,Java 不会清除缓冲区吗?我看不出是什么导致了这里的大量内存使用。我试图增加堆大小但它没有任何区别(具有 4GB RAM 的机器)。我还尝试每隔 X 行刷新一次输出文件,但也无济于事。我在想也许我需要给 GC 打电话,但这听起来不对。

有什么想法吗?非常感谢。顺便说一句——我知道我应该只调用 trim() 一次,存储它,然后使用它。

Set<String> set = new HashSet<String>();
set.add("A-B");
...
...
static public void main(String[] args) throws Exception
{
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile),"UTF-8"), 8192);
PrintStream output = new PrintStream(outputFile, "UTF-8");

String line = reader.readLine();
while(line!=null){
String[] fields = line.split("\t");
if( set.contains(fields[0].trim()+"-"+fields[1].trim()) )
output.println((fields[0].trim()+"-"+fields[1].trim()));

line = reader.readLine();
}

output.close();

}

最佳答案

最有可能发生的情况是文件没有行终止符,因此读取器只是不断地增长它的 StringBuffer 无限,直到它耗尽内存。

解决方案是使用读取器的“读取”方法一次读取固定数量的字节,然后在较小的缓冲区中查找新行(或其他解析标记)。

关于java - Java读取大文件——Java堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5890616/

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