Java PrintWriter потребляет большую память

Я пытаюсь написать большой текстовый файл из БД, около 2 миллионов строк. Я заметил, что пока PrintWriter печатает (println()) строку, размер файла всегда равен 0 байт. Файл имеет данные о размере после закрытия потока. Это приводит к тому, что все данные сначала сохраняются в памяти и освобождаются при закрытии потока. В моем случае после 1 млн. Данных +- 2,5 ГБ памяти потребляется. сбой приложения. Можно ли записывать данные в режиме реального времени и предотвратить потребление памяти?

Это пример:

    File file = new File("file.txt");

   PrintWriter out;

   out = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)), "UTF-8"));

for (int i=0; i < 9999999; i++){
    out.println("some data here");
}
out.close();

1 ответ

Вы создали PrintWriter без автоматической очистки строки, поэтому содержимое будет буферизироваться до тех пор, пока вы не вызовете flush() или же close(), Поскольку вы не хотите сбрасывать каждую строку (это медленно), вы можете выполнить сброс каждый N линии с

for (int i=0; i < 9999999; i++){
    out.println("some data here");
    if(i % N == 0)
        out.flush();
}

Попробуйте это с разными значениями N чтобы увидеть, как меняется производительность.

Другие вопросы по тегам