У меня есть пользовательский тип файла, который реализован в разделах с заголовком, показывающим смещение и длину каждого раздела в файле.
В настоящее время всякий раз, когда я хочу взаимодействовать с файлом, я должен либо загрузить и проанализировать всю вещь заранее, либо выбрать только те разделы, которые мне нужны, и загрузить только их.
Я хотел бы создать гибридный подход, при котором каждый из разделов загружается по требованию.
Кажется, однако, что выполнение этого имеет много потенциальных недостатков с точки зрения того, чтобы дескрипторы файловой системы оставались открытыми дольше, чем мне хотелось бы, и дополнительной сложности кода, которую я бы понес.
Существуют ли стандартные шаблоны для такого рода вещей? Похоже, мои варианты:
- Просто загрузите весь файл и перестаньте кричать о потерях циклов / памяти
- Загрузить весь файл в память в виде необработанных байтов, а затем удовлетворить любые запросы на выгруженные разделы из буфера памяти, а не с диска. Это избавляет меня от необходимости разбора ненужных разделов и требует меньше памяти (поскольку представление диска гораздо компактнее, чем объектная модель вокруг него), но все равно означает, что я трачу память на разделы, которые никогда не заканчиваются загрузкой.
- Загрузите все нужные мне разделы сразу и закройте файл, но держитесь за исходное местоположение файла. Затем, если запрашивается другой раздел, заново откройте файл и загрузите данные. В этом случае я могу получить странные результаты, если основной файл будет изменен.
- То же, что и выше, но оставить дескриптор файла открытым (возможно, разрешить общий доступ для чтения).
- Загрузите файл с помощью Memory-Mapped IO и оставьте открытым представление о файле.
Любые мысли