Три вещи.
1) То, что сказал Тимоти Уолтерс, верно, я более подробно остановлюсь.
2) 4500 файлов и 500 МБ данных - это просто много данных и запись на диск. Если вы работаете со всем набором данных, это будет медленно. Просто правда ввода / вывода.
3) Как уже упоминалось, подробностей по варианту использования нет.
Если мы примем сценарий с произвольным доступом только для чтения, то, по словам Тимоти, он практически мертв, а реализация проста.
В двух словах, вот что вы делаете.
Вы объединяете все файлы в один большой двоичный объект. Пока вы объединяете их, вы отслеживаете их имя файла, длину файла и смещение, с которого файл начинается в BLOB-объекте. Вы записываете эту информацию в блок данных, отсортированный по имени. Мы назовем это оглавлением или блоком оглавления.
Затем вы объединяете два файла вместе. В простом случае сначала у вас есть блок TOC, а затем блок данных.
Когда вы хотите получить данные из этого формата, найдите в TOC имя файла, возьмите смещение от начала блока данных, добавьте размер блока TOC и прочитайте байты данных FILE_LENGTH. Простой.
Если вы хотите быть умным, вы можете поместить оглавление в конец файла BLOB-объекта. Затем добавьте в самом конце смещение к началу оглавления. Затем вы переходите к концу файла, резервируете 4 или 8 байт (в зависимости от размера вашего номера), берете значение TH и еще дальше возвращаетесь к началу вашего оглавления. Тогда ты вернулся на круги своя. Вы делаете это, чтобы вам не нужно было перестраивать архив дважды в начале.
Если вы разместите ваш TOC в блоках (скажем, размером 1 КБ), то вы легко сможете выполнить двоичный поиск по TOC. Просто заполните каждый блок записями информации о файле, а когда вам не хватит места, напишите маркер, заполните нулями и перейдите к следующему блоку. Чтобы выполнить двоичный поиск, вы уже знаете размер оглавления, начните с середины, прочитайте имя первого файла и перейдите оттуда. Вскоре вы найдете блок, а затем прочитаете блок и отсканируете его на наличие файла. Это делает его эффективным для чтения, не имея всей TOC в оперативной памяти. Другое преимущество заключается в том, что для блокировки требуется меньше дисковой активности, чем для цепной схемы, такой как TAR (где вам нужно сканировать архив, чтобы что-то найти).
Я предлагаю вам также дополнить файлы размерами блоков, например, диски работают с блоками данных обычного размера, это тоже не сложно.
Обновление без перестройки целиком затруднительно. Если вам нужна обновляемая контейнерная система, вы можете также рассмотреть некоторые из более простых конструкций файловой системы, потому что это именно то, что вы действительно ищете в этом случае.
Что касается переносимости, я предлагаю вам хранить ваши двоичные числа в сетевом порядке, так как большинство стандартных библиотек имеют подпрограммы для обработки этих деталей для вас.