Я хотел бы сохранить пару записей в файл (оптимизированный для чтения) и хорошую структуру данных для этого, похоже, дерево B+. Он предлагает время доступа O(log(n)/log(b)), где b — количество записей в одном блоке.
Есть много статей и т. д., описывающих деревья B+, но у меня все еще есть некоторые проблемы с пониманием блочных систем хранения в целом. Может быть, кто-то может указать мне правильное направление или ответить на пару вопросов:
- Создают ли (все распространенные) файловые системы новые файлы в начале нового блока? Итак, могу ли я быть уверен, что seek(0) установит головку чтения/записи на кратное размеру блока устройства?
- Правильно ли, что я должен использовать только такие вызовы, как
pread(fd, buf, n * BLOCK_SIZE, p * BLOCK_SIZE)
(где n, p — целые числа), чтобы гарантировать, что я всегда читал полные блоки? - Лучше ли читать () байты BLOCK_SIZE в массив или mmap () вместо этого? Или есть разница только в том, что я mmap много блоков и получаю доступ только к нескольким? Что лучше?
- Должен ли я пытаться избежать порождения ключей несколькими блоками, добавляя байты заполнения в конце каждого блока? Должен ли я сделать то же самое для листовых узлов, добавив байты заполнения между данными?
Большое спасибо,
Кристоф