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()
чтобы просто записать весь контент (который вы собрали в памяти) одним выстрелом в файловую систему.
Это должно поддерживать общую сложность вашего нового кода на разумном уровне; но помогите с лучшей сквозной производительностью.