Загрузка определенного раздела сжатого файла потока - PullRequest
1 голос
/ 07 мая 2010

У нас есть простой двоичный формат файла для кэширования данных в нашем приложении (C # .NET Windows App). Формат в основном короткий, который указывает тип объекта, за которым следует идентификатор (строка) для идентификатора объекта, а затем любые специфические для объекта данные (строковые целые числа независимо от). Мы хотим иметь возможность хранить много объектов в одном и том же файле (> 10000), но в определенных ситуациях загружать только по требованию. Решение, которое у нас есть, состоит в том, чтобы сохранить индекс расположения объектов в файле - поэтому, когда мы начинаем писать новый объект, мы записываем позицию в файловом потоке, который запускает объект. Когда мы хотим загрузить этот объект, мы используем это индексированное местоположение для загрузки соответствующих данных. Это отлично работает.

Однако, если мы хотим сжать файл, будет ли этот метод все еще возможен? Я не слишком разбираюсь в том, как работает сжатие и, в частности, в классе GZipStream (System.IO.Compression), который мы планируем использовать. Насколько я понимаю, этот класс не поддерживает Seeking или свойство Position. Будет ли все еще возможно использовать поиск и положение базового FileStream (я предполагаю, что нет)? В принципе, возможно ли иметь сжатый файл, из которого мы можем выборочно загружать файлы? Если да, то как нам это сделать?

Спасибо

Steve

Ответы [ 3 ]

1 голос
/ 07 мая 2010

Нет, если вы хотите получить доступ к определенной позиции в несжатых данных, вам придется распаковать ее, по крайней мере временно

0 голосов
/ 15 октября 2012

лучшее решение:

используйте GZipStream для создания сжатых байтов в памяти, а затем напишите свой собственный класс для управления кэшированием и записью этого на диск (не используйте DeflateStream). Также напишите свой собственный класс для чтения этих данных с диска.

Затем вы можете убедиться, что базовый дисковый поток поддерживает Seeks.

0 голосов
/ 08 октября 2012

Это не настоящий поиск, но решение будет таким:

  • отслеживать вашу позицию в файле (вероятно, лучше всего это сделать, реализовав myBinaryReader, который наследуется от BinaryReader)
  • если вы ищете позицию вперед от вашей текущей позиции - ReadBytes, пока не доберетесь туда.
  • если вы ищете позицию до вашей текущей позиции - повторно откройте файл для распакованного чтения (чтосбрасывает вашу текущую позицию в ноль), а затем ReadBytes, пока вы не доберетесь до того места, где вы хотите быть.

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

В идеале базовый класс deflate должен быть изменен для поддержки истинного поиска.

...