Ответ в основном "нет".
Одному механическому дисковому накопителю потребуется около 10 мсек, чтобы выполнить поиск, потому что он должен переместить головку диска. 16000 раз поиска 10 миллисекунд на поиск равны 160 секундам. Не имеет абсолютно никакого значения, как вы пишете свой код; например mmap () ничего не изменит.
Добро пожаловать в физический мир, программист :-). Вы должны улучшить местность своих операций.
Сначала отсортируйте местоположения, к которым вы обращаетесь. Ближайшие местоположения в файле, скорее всего, будут рядом на диске, и поиск между соседними местоположениями быстрее, чем случайный поиск.
Затем ваш диск может считывать последовательные данные со скоростью около 100 мегабайт в секунду; то есть он может читать 1 мегабайт последовательно примерно за то же время, которое требуется для выполнения поиска. Поэтому, если два ваших значения находятся на расстоянии менее 1 мегабайта, вам лучше прочитать всех данных между ними , чем выполнять поиск между ними. (Но сравните это, чтобы найти оптимальный компромисс на вашем оборудовании.)
Наконец, RAID может помочь с пропускной способностью (но не время поиска). Он также может обеспечить несколько головок дисков, которые могут выполнять одновременный поиск, если вы хотите многопоточное чтение кода.
Но в целом доступ к случайным данным - это самое худшее, что вы можете попросить сделать у своего компьютера, будь то в памяти или на диске. И относительная разница между последовательным доступом и произвольным доступом увеличивается с каждым годом, потому что физика является локальной. (Ну, во всяком случае, физика, от которой мы здесь зависим.)
[править]
@ JeremyP советует использовать твердотельные накопители. Если они являются опцией, они имеют эффективное время поиска 0,1 мс или около того. Это означает, что вы могли ожидать, что ваш код будет работать в 50-100 раз быстрее на таком оборудовании. (Я не думал об этом, потому что я обычно работаю с файлами в диапазоне 1 ТБ, где твердотельные накопители будут слишком дорогими.)
[править 2]
Как @FrankH упоминает в комментарии, некоторые из моих предложений предполагают, что файл непрерывен на диске , что, конечно, не гарантируется. Вы можете помочь улучшить это, используя хорошую файловую систему (например, XFS) и давая «подсказки» во время создания файла (например, используйте posix_fallocate , чтобы сообщить ядру, что вы намереваетесь заполнить большой файл).