Java: писать большие файлы? - PullRequest
6 голосов
/ 07 января 2010

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

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

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
 //do writings
}
mbrWriter.close();

Ответы [ 3 ]

9 голосов
/ 07 января 2010

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

Таким образом, например,

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

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

4 голосов
/ 07 января 2010

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

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

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

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

0 голосов
/ 28 марта 2010

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

...