Я читаю большой файл 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 не очищает буфер после достижения предела размера буфера? Я не вижу, что может вызвать здесь большое использование памяти. Я пытался увеличить размер кучи, но это не имело никакого значения (машина с 4 ГБ ОЗУ). Я также пытался очищать выходной файл каждые 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();
}