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
чтобы увидеть, как меняется производительность.