Первое - если файл отсортирован, то поможет бинарный поиск. Самое "в лоб", но возможно не подойдет.
В качестве индекса можно использовать бинарное дерево. Но здесь, я бы сделал так:
- В узлах храним записи фиксированного размера, чтобы не бегать постоянно и дополнительно высчитывать смещения (все 16 байт для хранения использовать можно)
- Само дерево будет содержать отрезки, т.е. не полный готовый ответ. В противном случае, будет нарушено ограничение на размер (10Гб ты никак не перепрыгнешь)
В итоге, путь будет такой:
1. Идешь в индекс ("дерево отрезков") и находишь левую и правую границу
2. Идешь в целевой файл и запускаешь бинарный поиск по нему
Если хранить индекс в памяти, то будет гораздо быстрее. Но высоту дерева надо найти импирически из-за ограничения в 100Мб в памяти