Вопрос

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

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

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
 //do writings
}
mbrWriter.close();
Это было полезно?

Решение

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

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

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

Тем не менее, большинство достойных DB поставляются со встроенными возможностями экспорта в CSV, которые, несомненно, намного эффективнее, чем вы когда-либо могли бы сделать в Java.Вы не упомянули, какой из них вы используете, но если бы это был, например, MySQL, вы могли бы использовать LOAD DATA INFILE для этого.Просто обратитесь к документации, относящейся к конкретной базе данных.Надеюсь, это даст новое понимание.

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top