FileUtils.write скорость записи

Я пытаюсь прочитать из MySQL и записать результат в текстовый файл. Как вы можете видеть, я использую Apache Commons IO. Результирующий набор содержит твиты, и каждый приведенный ниже sql запрос почти возвращает 725 строк, которые нужно записать в текстовый файл. Моя проблема в скорости записи, она очень медленная (2-3 кб в секунду). Я что-то здесь упускаю?

Statement stmt2 = connection.createStatement();
        for (int week = 0 ; week<hashTag.length/15 ; week++){

            File container = new File("C:\\Users\\COMP\\Desktop\\threeMonthsSplitTxt\\weeklyBinsTwitter\\week"+week+"-"+hashTag[week]+".txt");

            for(int hash = 0 ; hash<15 ; hash++){
                ResultSet results = stmt2.executeQuery("select tweetContent
                    from threemonthswithhashtag
                    where hashTag = '"+hashTag[hashCount]+"'
                      and tweetCreatedTime between '"+firstDate[hashCount]+"'
                                               and '"+ lastDate[hashCount]+"';");

                while(results.next()){
                    tweetContent = results.getString("tweetContent");
                    try{
                        FileUtils.write(container,newLine,"UTF8",true);
                        FileUtils.write(container,tweetContent,"UTF8",true);
                    }catch(IOException e){e.getMessage();}
                }
                hashCount++;
            }
        }

1 ответ

Решение

Вы используете API, который будет создавать / открывать / закрывать файл (дескриптор) для каждой операции записи.

И вы удивлены тем, что это не дает вам оптимальной производительности?!

Этот метод может быть удобным, но, черт возьми, вместо того, чтобы идти

loop:
  try:
    open file; write to file; close file
    open file; write to file; close file

Подумайте о том, чтобы сделать что-то вроде

open file
loop:
  try:
    write to open file
    write to open file
close file

вместо. Конечно, это означает, что вам придется писать больше кода; усложнение вещей; но хорошо: нужно сбалансировать "супер-легкий для чтения" код с "достаточно хорошим" кодом.

Вероятно, самые переделки могут пойти даже так:

StringBuilder toWrite = ...
loop:
  try:
  toWrite.append(...)
  toWrite.append(...)

а затем, после цикла, вы используете FileUtils.write() чтобы просто записать весь контент (который вы собрали в памяти) одним выстрелом в файловую систему.

Это должно поддерживать общую сложность вашего нового кода на разумном уровне; но помогите с лучшей сквозной производительностью.

Другие вопросы по тегам