Хеш-таблицы на диске
Хеш-таблицы на диске
Контроллеры для таких устройств постоянного хранения данных, как жесткие и гибкие диски, дисководы Iomega Zip и ленточные накопители разработаны для поблочного считывания и записи данных. Обычно размер этих блоков равен какой-то степени двойки, например, 512, 1024 или 4096 байт. Поскольку контроллер должен выполнить считывание всего блока даже в том случае, когда требуется всего несколько байт, имеет смысл попытаться извлечь выгоду из подобного поведения.
Предположим, что требуется создать приложение, в котором используется большое количество записей, хранящихся на диске. Записи должны быть доступны в произвольном порядке по ключу. При этом каждая запись имеет отдельный уникальный строковый ключ. Это - идеальное применение для хеш-таблицы, однако записи столь многочисленны и велики, что невозможно выполнить их одновременное считывание в память. Действительно, делать это не имеет смысла, поскольку можно предположить, что большинство из них не будет требоваться в ходе любого отдельного сеанса работы программы.
Примером такого применения служит система пункта продажи в большом продуктовом супермаркете. В магазине могут продаваться сотни тысяч различных наименований товаров, из которых средний покупатель приобретает, скажем, не больше сотни (а то и десятка). Это идеальное применение для хеш-таблицы: каждый товар в магазине известен по его всемирному шифру продукта (UPC -Universal Product Code), т.е. 12-значному строковому значению, которое представляет собой уникальный ключ каждого товара. С учетом этого, приложение в кассовом пункте использует сканированный универсальный код товара с целью его хеширования в хеш-таблицу, а затем в запись, соответствующую товару.
Однако обратите внимание, что хранящаяся на диске хеш-таблица подходит только для обработки типа извлечения данных: получив ключ, она возвращает запись. Подобно своему аналогу, хранящемуся в памяти, хеш-таблица на диске не подходит для последовательного извлечения записей.
Прежде всего, создадим файл данных, состоящий из множества записей одинакового размера, каждая из которых описывает отдельный элемент. Естественно, для этого мы будем использовать класс TtdRecordFile, описанный в главе 2.
Файл индексов - это, по сути дела, второй файл базы данных хеш-информации. Как и в предыдущем случае, нам не нужно считывать в память весь файл индексов. Например, если бы каждый ключ содержал 10 цифр, а связанный с каждым ключом номер записи имел бы длину, равную 4 байтам, для хранения одного ключа требовалось бы 15 байт (исходя из предположения, что ключ содержит либо ноль в качестве символа-ограничителя, либо байт-префикс, определяющий его длину). Если бы хеш-таблица содержала 100 000 элементов, то для хранения ее индексов в памяти потребовалось бы минимум 1 500 000 байт. Разумеется, мы еще и выделяем дополнительную память под хранение строк ключей хеш-таблицы в куче, что приведет к еще большим накладным расходам (например, в 32-разрядной системе каждая строка кучи содержит три дополнительных символа типа longint). Значительно целесообразнее было бы считывать фрагменты индекса, когда в них возникает необходимость.
Применим метод группирования. В индексе хеш-таблицы мы используем группы фиксированного размера, чтобы при наличии ключа его можно было хешировать с целью получения требуемого номера группы, выполнить его считывание из файла индекса, а затем выполнить поиск требуемого ключа в группе. Эта методика выглядит достаточно простой, но, естественно, при этом необходимо предусмотреть действия на случай переполнения группы.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Указатели и теги на диске
Указатели и теги на диске Разработчики System/38 столкнулись с и другой проблемой. Допустим, потребуется переместить страницу из памяти на диск. В памяти есть дополнительные разряды для ЕСС и тегов, а на диске нет. Там используется другая форма кода коррекции ошибок,
Сохранение веб-страниц на диске
Сохранение веб-страниц на диске Как и любые другие файлы, веб-страницы можно сохранять на жестком диске, чтобы при необходимости обращаться к ним, не подключаясь к Сети. Для сохранения веб-документа нажмите кнопку Страница и выполните команду Сохранить как. В открывшемся
2.3. Разделы на диске и процесс загрузки
2.3. Разделы на диске и процесс загрузки 2.3.1. Что такое "геометрия диска"? Как вы знаете, жесткие диски представляют собой несколько пластин с магнитным покрытием, расположенных на одной оси и вращающихся с большой скоростью. Считывание/запись информации осуществляется с
2.5. Подготовка разделов на диске
2.5. Подготовка разделов на диске 2.5.1. Рекомендации по созданию разделов Рекомендации тут давать довольно сложно, так как во многом это зависит от воли и потребностей хозяина диска. Но все же попробую сформулировать некоторые предложения. При этом диски и разделы буду
8.6.1. Сколько осталось места на диске?
8.6.1. Сколько осталось места на диске? При установке новых пакетов очень часто возникает одна проблема, хорошо знакомая всем пользователям компьютеров: недостаток дискового пространства. Поэтому перед установкой нового пакета надо вначале ответить на вопрос о том,
Недостаточно места на диске
Недостаточно места на диске Если Windows постоянно выводит сообщения о том, что на диске мало места, то в разделе реестраHKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplоrer создайте параметр NoLowDiskSpaceChecks типа DWORD со значением, равным 1, – и windows заткнется :-)
Информация о диске
Информация о диске Щелкнув мышью на кнопке Инф. о диске, вы откроете одноименное окно. Вставьте в привод любой компакт-диск (аудио, видео, чистый компакт-диск для однократной записи, записанный CD-RW и т. д.). Щелкнув мышью на кнопке Обновить и выбрав этот привод из
Сохранение веб-страниц на диске
Сохранение веб-страниц на диске Как и любые другие файлы, веб-страницы можно сохранять на жестком диске, чтобы обращаться к ним, не подключаясь к Сети. Для сохранения веб-документа нажмите кнопку Страница и выберите команду Сохранить как. В открывшемся окне укажите папку,
12.3. Создание каталогов на диске
12.3. Создание каталогов на диске Постановка задачи Требуется возможность создавать на диске каталоги и сохранять в них определенные файлы из вашего
Размещение на диске по умолчанию
Размещение на диске по умолчанию Таблицы в этом разделе описывают размещение компонентов для Windows и Linux на диске по умолчанию. Информация дается в контексте двух версий:* версии, предшествующие Firebird 1.5;* версии Firebird 1.5 и последующие.Разница является существенной. Версии,
Обновление структуры на диске (ODS)
Обновление структуры на диске (ODS) Вероятно, основным изменением в новых релизах сервера Firebird является изменение структуры на диске (Оп-Disk Structure, ODS). Если ODS изменилась, и вы хотите использовать преимущества новых возможностей Firebird, обновите ваши базы данных до новой ODS.
Сохранение и восстановление документа на диске
Сохранение и восстановление документа на диске Построенное вами приложение можно использовать для рисования и печати документов, но оно не позволяет сохранять и загружать документ из файла на диске. Вы можете выбрать строку Save As (сохранить под именем) из меню File. На
2.4.1. Освобождаем место на диске
2.4.1. Освобождаем место на диске Требования Vista, как уже было отмечено, казались неподъемными для компьютеров того времени. На сегодняшний день требования Windows 7 не являются какими-то сверхъестественными. Например, Windows 7 Ultimate, установленная на мой компьютер, заняла чуть
Освобождение места на диске
Освобождение места на диске Несмотря на внушительные размеры современных жестких дисков, количество свободного места на них имеет тенденцию уменьшаться до нуля, и тогда система сообщит, что свободное место на диске почти закончилось и его необходимо очистить (рис. 8.27).