Любая доступная библиотека сжатия? - PullRequest
4 голосов
/ 12 января 2010

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

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

Ответы [ 7 ]

4 голосов
/ 05 августа 2010

для компиляции с возможностью поиска на gzip, есть dictzip с сервера dict и sgzip из набора sleuth

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

3 голосов
/ 21 декабря 2012
Файлы формата

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

1 голос
/ 14 августа 2013

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

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

1 голос
/ 05 февраля 2010

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();
        }
    }
}
0 голосов
/ 28 июля 2010

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

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

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

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

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

0 голосов
/ 05 февраля 2010

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

0 голосов
/ 12 января 2010

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

...