#java #performance #file-io
#java #Производительность #file-io
Вопрос:
Я должен извлечь 500 Тыс. строк из базы данных и записать эти данные в файл, то есть выполнить операцию ввода-вывода. Я выполнил два шага.
- Запишите каждую строку одну за другой в файл.
- Создайте фрагмент этих строк.Добавьте эти строки в StringBuffer и затем распечатайте его. Этот вариант будет лучше, но есть ли какой-либо способ, которым файловый ввод-вывод может создавать буфер самостоятельно, без использования StringBuffer . Поскольку этот строковый буфер занимает больше времени (внутренне он использует Arrays.copyOf)
Пожалуйста, предложите мне это, пожалуйста, найдите код, прикрепленный к этому
public void fetchDataWithChunkSpace(Connection con)throws Exception
{
String query ="select * from lis.testxml ";
long startTime=new Date().getMinutes();
PreparedStatement stmt = con.prepareStatement(query);
ResultSet rs = stmt.executeQuery();
PrintWriter pw = new PrintWriter(new File("c:\test_chunkSpace.xml"));
pw.write("<?xml version='1.0' encoding='UTF-8'?>");
StringBuffer sb = new StringBuffer();
String t=null;
long count =0;
while(rs.next())
{ count ;
t = rs.getString("xmltest");
sb = sb.append(t);
if(count%100==0)
{
pw.write(sb.toString());
sb = new StringBuffer();
System.out.println(count);
}
}
pw.write("n");
pw.write("</EndTag>");
pw.close();
stmt.close();
con.close();
long endTime=new Date().getMinutes();
System.out.println("chunkSpace ---> " (endTime-startTime));
}
Комментарии:
1. Итак, в чем ваша проблема? И в чем ваш вопрос?
2. Пожалуйста, покажите код того, как вы записываете в файл. Файловый ввод-вывод обычно выполняется в буферном режиме.
3. Возможно, вам следует показать какой-нибудь код. Вы можете напрямую записывать в OutputStream вместо буферизации в StringBuffer, вы можете использовать StringBuilder, инициализировать буфер / конструктор ожидаемым размером (целочисленный аргумент в конструкторе) … есть несколько вариантов. В чем именно ваша проблема, она слишком медленная?
4. Больше всего похоже на то, что чтение из базы данных — это ваше бутылочное горлышко. То, как вы записываете данные в файл, вряд ли будет иметь значение. Вы должны иметь возможность записывать в файл текст со скоростью до 90 МБ / с, в зависимости от скорости вашего диска. Кстати, я бы использовал StringBuilder, как предложено в Javadoc StringBuffer.
5. Почему в нем нет отступов? Это в такой форме в вашем редакторе? Или это потому, что вы не потрудились представить его в понятной форме?
Ответ №1:
Посмотрите на BufferedOutputStream или BufferedWriter .
Также учтите, что StringBuffer является потокобезопасным классом с синхронизированными методами, в отличие от StringBuilder .
Обновить. Попробуйте этот код:
Writer pw = new BufferedWriter(new PrintWriter(new File("c:\test_chunkSpace.xml")));
pw.write("<?xml version='1.0' encoding='UTF-8'?>");
String t;
while (rs.next()) {
t = rs.getString("xmltest");
pw.write(t);
}
Комментарии:
1. Я провел еще один анализ с помощью RandomAccessFile, который повышает производительность в этом сценарии.
Ответ №2:
Комментарии:
1. 1: это то, что я бы сделал, даже если объяснение немного короткое. 😉
2. @gaurav, ты можешь попробовать использовать BufferedWriter вместо StringBuffer ?
3. IMHO BufferedWriter и StringBuffer можно использовать вместе, StringBuffer обеспечивает лучшую производительность и использование памяти при работе со строками, в то время как BufferedWriter улучшает ввод-вывод за счет буферизации во время записи в файл / FileWriter, например
4. BufferWriter предоставляет все преимущества StringBuffer (но не синхронизируется), использование обоих, скорее всего, просто дублирует усилия.
5. Зависит от того, что вы хотите сделать — у обоих есть append(), но это делает BufferedWriter заменой StringBuffer . Если вы уверены, что потокобезопасность не является проблемой, вы можете использовать StringBuilder вместо StringBuffer, но, честно говоря, я не знаю, насколько большим будет повышение производительности.
Ответ №3:
Вы должны использовать библиотеку XML для создания XML. В противном случае вы не создадите действительный XML, и это будет ваша вина. Вы должны максимально использовать буферизацию вывода, чтобы ускорить процесс записи, однако я согласен с другими постерами, что вы, скорее всего, привязаны к базе данных, а не к тому, что есть много возможностей для улучшения вашего фактического кода.