У меня есть огромный набор результатов, включая, скажем, 1 миллион строк. Обычно я использую следующий фрагмент, чтобы записать их в файл, тогда как я всегда не в памяти. Есть ли эффективные способы устранения этой проблемы?
PrintWriter writer = new PrintWriter(filename, "UTF-8");
iteration -> { writer.println(a single string); }
writer.close();
Поскольку вы сказали ResultSet, я полагаю, это происходит из базы данных? Сначала используйте набор результатов потоковой передачи. Драйверу MySQL JDBC нравится буферизировать все строки в памяти, а с 1M (или 1B) строками это может быть проблемой.
Если вы хотите, чтобы это масштабировалось, делайте это по-разному. У вас есть один поток, производитель, чтение строк из ResultSet, а другой - потребитель, записывающий строки в файл. Что-то вроде ArrayBlockingQueue отлично подходит для этого. Если потребитель не может идти в ногу с производителем, начать блокировку и ждать от потребителя, чтобы догнать. Этот подход занимает меньше памяти и быстрее, поскольку ваш IO выполняется параллельно.