Я попытался частично отсортировать номера записей, поместив отображения A-> B и B-> A в разреженный массив, и сбрасывал самые плотные кластеры записей на диск всякий раз, когда мне не хватало памяти.похоже, что это приведет к чрезмерно высоким издержкам syscall.
Вы можете использовать доступ к файлу с отображением в памяти, чтобы избежать издержек syscall. mmap () в * NIX и CreateFileMapping () в Windows .
Логически разбить файл на блоки, например, 32 МБ.Если что-то нужно изменить в блоке, mmap (), измените данные, при необходимости, msync (), munmap (), а затем перейдите к следующему блоку.
Это было бы то, что я пробовалпервый.ОС будет автоматически читать все, что нужно (при первом доступе к данным), и она будет ставить в очередь ввод-вывод в любом случае.
Важно помнить, что реальный ввод-вывод не такой быстрый.Факторами, ограничивающими производительность для произвольного доступа, являются (1) количество операций ввода-вывода в секунду (IOPS), которые может обрабатывать хранилище, и (2) количество обращений к диску.(Обычный IOPS находится в диапазоне сотен. Обычная задержка поиска составляет 3-5 мс.) Например, хранилище может считывать / записывать 50 МБ / с: один непрерывный блок 50 МБ в секунду.Но если вы попытаетесь пропатчить байтовый файл размером 50 МБ, то время поиска просто снизит производительность.До некоторого предела можно читать больше и писать больше, даже если обновлять только несколько байтов.
Другим ограничением, которое необходимо соблюдать, является максимальный размер операции ввода-вывода в ОС: он зависит от хранилища, но большинствоОС будут разделять задачи ввода-вывода размером более 128K.Предел может быть изменен и лучше всего, если он синхронизирован с аналогичным пределом в хранилище.
Также имейте в виду хранилище.Многие люди забывают, что хранилище часто только одно.Здесь я пытаюсь сказать, что начальная загрузка потоков не помогает IO, если у вас нет нескольких хранилищ.Даже один процессор / ядро может легко насыщать RAID10 с его 800 IOPS чтения и 400 IOPS записи лимитами.(Но выделенный поток для хранилища по крайней мере теоретически имеет смысл.)
Надеюсь, это поможет.Другие люди часто упоминают Boost.Asio, с которым у меня нет опыта, но это стоит проверить.
PS Честно говоря, я хотел бы услышать другие (более информативные) ответы на ваш вопрос.Я был в лодке уже несколько раз, но у меня не было шансов действительно спуститься к ней.Книги / ссылки / и т.д., связанные с оптимизацией ввода-вывода (независимо от платформы), приветствуются;)