Я работаю над задачей, в которой мне нужно прочитать огромный файл (размером ~ 1,5 ГБ и приблизительно 16000000 записей). Передо мной два варианта:
- использовать BufferReader, где я могу получить каждую строку в строке.
- использовать MappedByteBuffer с FileChannel и RandomAccessFile.
В сыром тесте читать нет. записей с опцией 1, это занимает около 2900 мс, а в варианте 2 это занимает около 1450 мс.
Тестовые программы следующие:
Опция 1:
public static void reviewBufferedReader () {
long lineNumber = 0;
String line = null;
try (BufferedReader b = Files.newBufferedReader(Paths.get("D:\\\\Temp Data Files\\Data1.txt"), StandardCharsets.UTF_8)) {
executor = RecordsDistributionExecutor.getInstance();
while ((line = b.readLine()) != null) {
lineNumber++;
}
} catch (Exception e) {
System.err.println("Error in reviewBufferedReader : "+e.getMessage());
} finally {
}
System.out.println("Total no. of lines: "+lineNumber);
}
Вариант 2:
public static void reviewFileChannelWithMappedByteBuffer () {
long lineNumber = 0;
try (RandomAccessFile raFile = new RandomAccessFile("D:\\\\Temp Data Files\\Data2.txt", "r");
FileChannel inChannel = raFile.getChannel();){
MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
buffer.load();
char c;
for(int i = 0; i< buffer.limit(); i++) {
c = (char) buffer.get();
if ('\n' == c) {
lineNumber++;
}
}
buffer.clear(); // do something with the data and clear/compact it.
} catch (Exception e) {
System.err.println("Error in reviewFileChannelWithMappedByteBuffer : "+e.getMessage());
} finally {
}
System.out.println("Total no. of lines: "+lineNumber);
}
Как я уже сказал, Вариант 2 занимает меньше времени при базовом c тестировании.
У меня вопрос, возможно ли прочитать данные файла строка за строкой в варианте 2, как вариант 1.
Спасибо,
Атул