Java: запись больших файлов?

Поздравления, я получаю огромное количество записей от базы данных и записи в файл. Я задавался вопросом что лучший способ записать огромные файлы. (1 ГБ - 10 ГБ).

В настоящее время я использую BufferedWriter

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
 //do writings
}
mbrWriter.close();
6
задан Ashika Umanga Umagiliya 7 January 2010 в 02:38
поделиться

3 ответа

Если Вы действительно настаиваете на использовании для этого Java, то лучший способ - это записать немедленно , как только данные поступят, и таким образом не собирать все данные из ResultSet в память Java в первую очередь. В противном случае вам понадобилось бы, по крайней мере, столько свободной памяти на Java.

Таким образом, сделайте, например,

while (resultSet.next()) {
    writer.write(resultSet.getString("columnname"));
    // ...
}

Тем не менее, большинство достойных кораблей БД со встроенными возможностями экспорта в CSV, которые, несомненно, намного эффективнее, чем вы когда-либо могли бы сделать на Java. Вы не упомянули, какой из них вы используете, но если бы это был, например, MySQL, то для этого можно было бы использовать LOAD DATA INFILE - ИНФОРМАЦИЮ ДАННЫХ. Просто обратитесь к документации по конкретной БД. Надеюсь, это даст новое понимание.

9
ответ дан 8 December 2019 в 18:37
поделиться

Размер буфера по умолчанию для BufferedWriter составляет 8192. Если вы собираетесь записывать скигабайтные файлы, вы можете увеличить его, используя конструктор с двумя аргументами; например

int buffSize = ... // 1 megabyte or so
BufferedWriter mbrWriter = new BufferedWriter(new FileWriter(memberCSV), buffSize);

Это должно уменьшить количество системных вызовов, необходимых для записи файла.

Но я сомневаюсь, что разница будет больше пары процентов. Извлечение строк из набора результатов, вероятно, будет основным узким местом производительности. Для значительного повышения производительности вам необходимо использовать собственные средства массового экспорта базы данных.

4
ответ дан 8 December 2019 в 18:37
поделиться

Я не уверен на 100%, но похоже, что BufferedReader загружает данные в буфер в ОЗУ. Java может использовать 128 МБ RAM (если не указано иное), поэтому BufferedReader, скорее всего, переполнит память Java, что приведет к ошибке. Попробуйте использовать InputStreamReader и FileInputStream для чтения, а затем сохранить данные в виде символа, а затем просто напишите этот символ с помощью FileOutputStream.

0
ответ дан 8 December 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: