Как эффективно выполнить случайный поиск в файле? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть файл, который хранится на диске, и записи записываются в файл в произвольном формате записи.Куча записей будет представлять блок.Когда вы выполняете чтение на диске, вы можете выбрать только блок вместо записи.

Block = physical record.
Data = logical record.

Каждая логическая запись имеет уникальное смещение в файле.Это ближе к формату записи leveldb.

Учитывая кучу смещений, как бы вы эффективно прочитали логическую запись?

1 Ответ

0 голосов
/ 24 мая 2018

На практике в большинстве современных операционных систем и оборудования это не имеет значения много.

Чтение Операционные системы: три простых компонента для более.

Во-первых, операционная система поддерживает кэш страниц , который содержит недавно прочитанные или записанные страницы.Смотрите также linuxatemyram .Так много операций дискового ввода-вывода не выполняется аппаратно, и они не выполняются в том порядке, в котором вы их запрашивали.Подробнее о производительности жесткого диска .

Затем следует напомнить, что все больше и больше дисков SSD с (без какой-либо задержки вращения и постоянного времени доступа).И текущий жесткий диск s не использует CHS , но LBA , поэтому адрес блока не связан непосредственно с его физическим положением (и диск )контроллер сам обрабатывает сопоставление).

В некоторых случаях диск ядра драйвер и файловая система реорганизуют ожидающие запросы диска.

Тем не менее, вам будет лучше выполнить дисковый ввод-вывод на достаточно больших буферах (как правило, по несколько страниц по 4 Кбайт по крайней мере для каждой read (2) или write (2) ).

В Linux см. Также sync (2) , fsync (2) , posix_fadvise (2) , readahead (2) , mmap (2) , madvise (2) системные вызовы

Учитывая кучу смещений, как быВы эффективно читаете логическую запись?

Вы могли бы заказать эти смещения, но это практически не изменится и, вероятно, вообще не изменится.Обязательно бенчмаркируйте.

На практике используйте некоторые библиотеки, такие как leveldb или gdbm (проиндексированные файлы) или sqlite .Вы можете настроить некоторые параметры (размеры буфера), но вы должны доверять библиотеке в остальном.

...