Я должен извлечь 500 тыс. строк из базы данных и записать эти данные в файл, что означает выполнение операции ввода-вывода

#java #performance #file-io

#java #Производительность #file-io

Вопрос:

Я должен извлечь 500 Тыс. строк из базы данных и записать эти данные в файл, то есть выполнить операцию ввода-вывода. Я выполнил два шага.

  1. Запишите каждую строку одну за другой в файл.
  2. Создайте фрагмент этих строк.Добавьте эти строки в 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, и это будет ваша вина. Вы должны максимально использовать буферизацию вывода, чтобы ускорить процесс записи, однако я согласен с другими постерами, что вы, скорее всего, привязаны к базе данных, а не к тому, что есть много возможностей для улучшения вашего фактического кода.