Кирилл Гусарев,
Можно взять SQLITE в качестве СУБД. Если же импортировать из файла по какой-то причине нельзя, тогда при построчном чтении хранить смещение от начала файла вместе с длиной строки вместо самой строки. Получается, просто индекс. И это так же по эффективности. А сам индекс точно можно хранить в памяти.
Однако, придётся работать и с СУБД и и с файлом, что не так удобно (просто) как если при импорте.