Любая библиотека сжатия, которую можно найти?


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

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

7 4

7 ответов:

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

Для сборки искомого сжатия на gzip есть dictzip от сервера dict и sgzip от sleuth kit

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

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

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

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

ASP.NET поставщик виртуальных путей ZIP, основанный на 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();
        }
    }
}

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

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

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

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

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

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

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

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

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