OutOfMemoryError: Как сбросить размер буфера BufferedReader?

Нужно максимально быстро читать большие файлы. Для чтения используется BufferedReader в таком виде:

String line, data="";
            int RAM = 1073741822; //1Gb
                 try (BufferedReader br = new BufferedReader(new FileReader(path), RAM)) {
                        while((line=br.readLine())!= null) {
                                data+=line;
                                }
                        br.close();
                        }
                

Один раз метод отрабатывает без проблем. Но на втором вызове возникает ошибка OutOfMemoryError. По всей видимости JVM или BufferedReader кэширует размер буфера невзирая на его закрытие... Существуют ли какие-то решения?


Ответы (1 шт):

Автор решения: Труфальдино

jvm oracle, 32 разряда,2 ГБ java memory, GC policy стандатная не парралельная. Исходный файл 1,5 ГБ. Обрабатывает два файла. Потом умирает. Два файла по 1,5 GB jvm успевает обработать за один цикл GC. Можно поиграться с GC policy.

 File f = new File("c:\\work\\Camera1.zip"); // 1.5 Gg
    try (RandomAccessFile raf = new RandomAccessFile(f, "r");
    FileChannel fc = raf.getChannel();) 
    {
    if ((int) fc.size() <= Integer.MAX_VALUE - 1) 
    {
    java.nio.ByteBuffer buffer = java.nio.ByteBuffer.allocate((int) fc.size());
    fc.read(buffer);
    buffer.flip();
    System.err.println(":= " +buffer.isDirect());
    buffer.clear();
    
    java.nio.ByteBuffer buffer2 = java.nio.ByteBuffer.allocate((int) 
    fc.size());
    fc.read(buffer2);
    buffer.flip();
    System.err.println("2:= " +buffer.capacity());
    buffer2.clear();
    }

}

В асинхронном режиме работает и не умирает. Правда диск начинает подвывать, но не умирает.

→ Ссылка