2010-01-12 4 views
4

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

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

+1

Если вы хотите получить произвольный доступ, вам, вероятно, придется так или иначе удалять входные данные. Что может быть лучше, чем побочная статья? –

+0

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

+1

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

ответ

3

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

+1

Похож на перспективный проект. Благодарю. –

0

Вы не указали свою ОС. Можно ли сохранить файл в сжатом каталоге, управляемом ОС? Тогда у вас будет «доступная для поиска» часть, а также сжатие. Накладные расходы процессора будут обрабатываться для вас с непредсказуемым временем доступа.

+0

Я предпочел бы портативную библиотеку среди разных ОС. Сжатая файловая система, безусловно, является решением, но работает ли она (с точки зрения скорости и памяти) при произвольном доступе? –

+0

Вы продаете пространство для скорости. Затраты на сжатие. –

1

DotNetZip - это zip-архивная библиотека для .NET.

Использование DotNetZip позволяет случайным образом ссылаться на отдельные записи в zip и может распаковывать их вне порядка и может возвращать поток, который распаковывается при извлечении записи.

С помощью этих функций DotNetZip был использован в реализации Virtual Path Provider for ASP.NET, что делает именно то, что вы описали, - он обслуживает весь контент для определенного сайта из сжатого ZIP-файла. Вы также можете создавать веб-страницы с динамическими страницами (ASP.NET).

ASP.NET ZIP Virtual Path Provider, based on DotNetZip

Важный код выглядит следующим образом:

namespace Ionic.Zip.Web.VirtualPathProvider 
{ 
    public class ZipFileVirtualPathProvider : System.Web.Hosting.VirtualPathProvider 
    { 
     ZipFile _zipFile; 

     public ZipFileVirtualPathProvider (string zipFilename) : base() { 
      _zipFile = ZipFile.Read(zipFilename); 
     } 

     ~ZipFileVirtualPathProvider() { _zipFile.Dispose(); } 

     public override bool FileExists (string virtualPath) 
     { 
      string zipPath = Util.ConvertVirtualPathToZipPath (virtualPath, true); 
      ZipEntry zipEntry = _zipFile[zipPath]; 

      if (zipEntry == null) 
       return false; 

      return !zipEntry.IsDirectory; 
     } 

     public override bool DirectoryExists (string virtualDir) 
     { 
      string zipPath = Util.ConvertVirtualPathToZipPath (virtualDir, false); 
      ZipEntry zipEntry = _zipFile[zipPath]; 

      if (zipEntry != null) 
       return false; 

      return zipEntry.IsDirectory; 
     } 

     public override VirtualFile GetFile (string virtualPath) 
     { 
      return new ZipVirtualFile (virtualPath, _zipFile); 
     } 

     public override VirtualDirectory GetDirectory (string virtualDir) 
     { 
      return new ZipVirtualDirectory (virtualDir, _zipFile); 
     } 

     public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies) 
     { 
      return null; 
     } 

     public override System.Web.Caching.CacheDependency GetCacheDependency(String virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart) 
     { 
      return null; 
     } 
    } 
} 

И VirtualFile определяется следующим образом:

namespace Ionic.Zip.Web.VirtualPathProvider 
{ 
    class ZipVirtualFile : VirtualFile 
    { 
     ZipFile _zipFile; 

     public ZipVirtualFile (String virtualPath, ZipFile zipFile) : base(virtualPath) { 
      _zipFile = zipFile; 
     } 

     public override System.IO.Stream Open() 
     { 
      ZipEntry entry = _zipFile[Util.ConvertVirtualPathToZipPath(base.VirtualPath,true)]; 
      return entry.OpenReader(); 
     } 
    } 
} 
0

Я использую MS Windows Vista, к сожалению, и я могу отправьте файл-проводник в zip-файлы, как если бы они были обычными файлами. Предположительно, он по-прежнему работает на 7 (который я хотел бы включить). Я думаю, что я тоже это сделал с соответствующей утилитой на Ubuntu, но я не уверен. Я тоже могу проверить его на Mac OSX.

0

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

В принципе, это обеспечивает лучшее сжатие, чем сжатие каждой статьи по отдельности, но хуже сжатие, чем сплошное сжатие всех изделий вместе. Извлечение статьи 12 из сжатой партии требует декомпрессии всей партии (а затем выброса первых 11 статей), но это все равно намного быстрее, чем распаковка половины Википедии.

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

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

Для более сложных методов, вы можете посмотреть на

4

для сжимаемое сжатие на gzip, есть dictzip с сервера dict и sgzip из набора для сыщиков

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

1

bgzf - формат, используемый в геномике. http://biopython.org/DIST/docs/api/Bio.bgzf-module.html

Это часть библиотеки samtools C и на самом деле просто простая ручка вокруг gzip. Возможно, вы можете переписать его самостоятельно, если вы не хотите использовать реализацию samtools C или реализацию picard java. Biopython реализует вариант python.

+0

Это выглядит как простая библиотека обертки поверх zlib. Данные разбиваются на 64 тыс. Блоков и сжимаются независимо. Но я думаю, что можно получить лучшую степень сжатия. –

+0

Это просто простой хак, но он работает из коробки и имеет полезный инструмент командной строки. Возможно, вы получите лучшее сжатие, но сейчас это работает. – Max

Смежные вопросы