Запись огромных строк в файл

1

У меня есть огромный набор результатов, включая, скажем, 1 миллион строк. Обычно я использую следующий фрагмент, чтобы записать их в файл, тогда как я всегда не в памяти. Есть ли эффективные способы устранения этой проблемы?

 PrintWriter writer = new PrintWriter(filename, "UTF-8");
 iteration -> { writer.println(a single string); }

 writer.close();
  • 2
    Исследовать буферизацию. Таким образом, вы потребляете столько памяти, сколько пожелаете.
  • 1
    Попробуйте промыть писатель после печати.
Показать ещё 4 комментария
Теги:
memory-leaks
resultset
printwriter

1 ответ

1

Поскольку вы сказали ResultSet, я полагаю, это происходит из базы данных? Сначала используйте набор результатов потоковой передачи. Драйверу MySQL JDBC нравится буферизировать все строки в памяти, а с 1M (или 1B) строками это может быть проблемой.

Если вы хотите, чтобы это масштабировалось, делайте это по-разному. У вас есть один поток, производитель, чтение строк из ResultSet, а другой - потребитель, записывающий строки в файл. Что-то вроде ArrayBlockingQueue отлично подходит для этого. Если потребитель не может идти в ногу с производителем, начать блокировку и ждать от потребителя, чтобы догнать. Этот подход занимает меньше памяти и быстрее, поскольку ваш IO выполняется параллельно.

  • 1
    То же самое относится и к PostgreSQL, кстати. Вы хотите установить fetchSize.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню