Открытие пользовательского файла по запросу - PullRequest
1 голос
/ 29 июля 2009

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

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

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

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

Существуют ли стандартные шаблоны для такого рода вещей? Похоже, мои варианты:

  1. Просто загрузите весь файл и перестаньте кричать о потерях циклов / памяти
  2. Загрузить весь файл в память в виде необработанных байтов, а затем удовлетворить любые запросы на выгруженные разделы из буфера памяти, а не с диска. Это избавляет меня от необходимости разбора ненужных разделов и требует меньше памяти (поскольку представление диска гораздо компактнее, чем объектная модель вокруг него), но все равно означает, что я трачу память на разделы, которые никогда не заканчиваются загрузкой.
  3. Загрузите все нужные мне разделы сразу и закройте файл, но держитесь за исходное местоположение файла. Затем, если запрашивается другой раздел, заново откройте файл и загрузите данные. В этом случае я могу получить странные результаты, если основной файл будет изменен.
  4. То же, что и выше, но оставить дескриптор файла открытым (возможно, разрешить общий доступ для чтения).
  5. Загрузите файл с помощью Memory-Mapped IO и оставьте открытым представление о файле.

Любые мысли

Ответы [ 2 ]

1 голос
/ 30 июля 2009

Если файл сравнительно небольшой, достаточно отобразить весь файл. Если файл большой, вы можете оставить представление mmap открытым и просто переместить его вокруг файла и изменить его размер, чтобы при необходимости просматривать каждый раздел.

1 голос
/ 29 июля 2009

Если возможно, MMAP-весь файл обычно проще всего сделать , если у вас есть шаблон с произвольным доступом. Таким образом, вы просто делегируете проблему загрузки / выгрузки ОС, и у вас есть 1 и 2 бесплатно.

Если у вас есть очень особые шаблоны доступа, вы можете даже использовать что-то вроде fadvise () (я не точный эквивалент Win32), чтобы сообщить ОС о вашем намерении доступа.

Если размер вашего файла превышает 2 ГБ, и вы можете использовать 64-битную версию или mmap () файл по требованию.

...