Это приводит к ненужным операциям сканирования.
Я предполагаю, что вы ссылаетесь на издержки поиска некоторой точки, а затем находите следующую действительную начальную позицию строки CSV, читая до тех пор, пока не достигнете следующей новой строки.
Я могу придумать три способа сделать это, которые могут быть более эффективными, чем то, что вы делаете в настоящее время:
Прочитать весь файл и разобрать строки в прямом направлении, сохраняя позиции в памяти. Затем обработайте строки в памяти в обратном порядке.
Сканирование файла с самого начала в поисках начала строки и сохранение начальных позиций строки в памяти. Затем перебирайте позиции в обратном порядке, стараясь, чтобы каждая прочитала соответствующую строку. (Вы можете сделать ввод более эффективно, обрабатывая несколько строк в каждом поиске.)
Отобразить файл в память, используя MappedByteBuffer
, затем вы можете пошагово пройти через Байт-буфер вперед или назад, чтобы найти границы строк.
Первый подход требует, чтобы вы могли буферизовать весь файл в памяти, но имеет меньшие накладные расходы ввода-вывода, потому что вы читаете файл только один раз с минимальным количеством системных вызовов. Третий подход имеет ту же самую проблему, хотя вы можете отобразить очень большой файл в память в (больших) разделах, чтобы уменьшить требования к памяти.
Но, в конечном счете, в Java нет простого и эффективного способа чтения файла в обратном направлении.