Не могу предложить ни одной существующей библиотеки, но я уже сталкивался с подобной проблемой.Это довольно просто, если вы не планируете динамически изменять свой список и можете сортировать строки в файле (для двоичного поиска).
Давайте разберем ваши 40 МБ на 1000 кусков примерно одинакового размера и сохраним первую строкуиз каждого куска в памяти.Это был бы массив из 1000 строк.Они упорядочены, потому что упорядочен оригинальный список.
Когда вам нужно выполнить запрос, вы можете использовать бинарный поиск по этому массиву.Это покажет вам, в какой строке результата находится фрагмент.Затем вы можете прочитать этот фрагмент с диска (около 40 КБ) и выполнить поиск по его содержимому.
Например, если массив содержит значения ["andrew", "brian", "donald", "john"]
и вы ищете префикс "cris"
, вы знаете, что все кристофоры и кристианево втором куске.