我正在读取一个大的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();
}