Как уже отмечали другие, если у вас нет линий фиксированной ширины, невозможно обойтись без построения индекса. Однако, если вы контролируете формат файла, вы можете получить производительность ~ O (log (размер)) вместо O (размер) при поиске начальной строки, если вам удастся сохранить номер самой строки на каждая строка, т.е. чтобы содержимое файла выглядело примерно так:
1: val1, val2, val3
2: val4
3: val5, val6
4: val7, val8, val9, val10
С этим форматом файла вы можете быстро найти нужную строку с помощью бинарного поиска: начните с поиска в середине файла. Читайте до следующей новой строки. Затем прочитайте строку и проанализируйте номер. Если число больше целевого, вам нужно повторить алгоритм для первой половины файла, если оно меньше целевого номера строки, то вам нужно повторить его для второй половины файла.
Вы должны быть осторожны с угловыми случаями (например, ваше «начало» диапазона и «конец» диапазона находятся на одной линии и т. Д.), Но для меня этот подход отлично работал в Прошло время разбора лог-файлов, в которых была дата (и мне нужно было найти строки между определенными временными метками).
Конечно, это все еще не превосходит производительность явно построенного индекса или записей фиксированного размера.