Мне нужно прочитать огромный файл (15 + ГБ) и выполнить некоторые незначительные изменения (добавьте некоторые новые строки, чтобы с ним мог работать другой парсер). Вы можете подумать, что для этого обычно есть ответы:
но весь мой файл находится на одной строке.
Мой общий подход до сих пор очень прост:
char[] buffer = new char[X];
BufferedReader reader = new BufferedReader(new ReaderUTF8(new FileInputStream(new File("myFileName"))), X);
char[] bufferOut = new char[X+a little];
int bytesRead = -1;
int i = 0;
int offset = 0;
long totalBytesRead = 0;
int countToPrint = 0;
while((bytesRead = reader.read(buffer)) >= 0){
for(i = 0; i < bytesRead; i++){
if(buffer[i] == '}'){
bufferOut[i+offset] = '}';
offset++;
bufferOut[i+offset] = '\n';
}
else{
bufferOut[i+offset] = buffer[i];
}
}
writer.write(bufferOut, 0, bytesRead+offset);
offset = 0;
totalBytesRead += bytesRead;
countToPrint += 1;
if(countToPrint == 10){
countToPrint = 0;
System.out.println("Read "+((double)totalBytesRead / originalFileSize * 100)+" percent.");
}
}
writer.flush();
После некоторых экспериментов я обнаружил, что значение X, превышающее миллион, дает оптимальную скорость - похоже, что я получаю около 2% каждые 10 минут, а значение X ~ 60 000 только на 60% через 15 часов. Профилирование показывает, что я трачу 96%% моего времени на метод read(), так что определенно мое узкое место. Начиная с написания этого, моя 8-миллионная версия X закончила 32% файла через 2 часа и 40 минут, если вы хотите знать, как она работает в течение длительного времени.
Есть ли лучший подход для работы с таким большим однострочным файлом? Как и в, есть ли более быстрый способ чтения этого типа файла, который дает мне относительно простой способ вставки символов новой строки?
Я знаю, что различные языки или программы, возможно, справятся с этим изящно, но я ограничиваю это перспективой Java.