Любая библиотека сжатия с возможностью поиска?

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

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


person Wu Yongzheng    schedule 12.01.2010    source источник
comment
Если вам нужен произвольный доступ, вам, вероятно, придется так или иначе разбить ввод. Что может быть лучше, чем разбивка по статьям?   -  person Anon.    schedule 12.01.2010
comment
... которую поддерживают почти все библиотеки сжатия, статья приравнивается к записи в файл.   -  person Eric J.    schedule 12.01.2010
comment
Кроме того ... Я сомневаюсь, что будет большая разница между степенью сжатия для статей по отдельности и степенью сжатия для всей статьи, поскольку они должны иметь в основном одинаковое соотношение вхождений букв. Вы проверили это утверждение?   -  person Eric J.    schedule 12.01.2010
comment
Проблема с сжатием статей по отдельности заключается в том, что вы получаете целый пакет файлов, что само по себе приводит к неэффективности. Скажем, файл размером 1 ГБ будет намного более компактным и простым в использовании, чем 80 000 файлов, в среднем около 10 КБ каждый, даже если это более сильное сжатие.   -  person David Thornley    schedule 05.02.2010


Ответы (7)


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

person vasi    schedule 20.12.2012
comment
Похоже на перспективный проект. Спасибо. - person Wu Yongzheng; 22.12.2012
comment
Я использую pixz каждый день. Это круто. Спасибо! - person Roger Dahl; 19.06.2021

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

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

person Dan D.    schedule 05.08.2010

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

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

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

ASP.NET ZIP Virtual Path Provider на основе 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();
        }
    }
}
person Cheeso    schedule 05.02.2010

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

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

person Max    schedule 13.08.2013
comment
Похоже на простую библиотеку-оболочку поверх zlib. Данные разбиваются на блоки по 64 КБ и сжимаются независимо. Но я думаю, что можно получить лучшую степень сжатия. - person Wu Yongzheng; 14.08.2013
comment
Это простой способ взлома, но он работает из коробки и имеет полезный инструмент командной строки. Вы, вероятно, сможете улучшить сжатие, но это то, что работает прямо сейчас. - person Max; 28.08.2013

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

person No Refunds No Returns    schedule 12.01.2010
comment
Я бы предпочел переносную библиотеку среди разных ОС. Сжатая файловая система, безусловно, является решением, но хорошо ли она работает (с точки зрения скорости и памяти) при произвольном доступе? - person Wu Yongzheng; 12.01.2010
comment
вы меняете место на скорость. Затраты на угнетение. - person No Refunds No Returns; 12.01.2010
comment
@NoRefundsNoReturns По крайней мере, дисковые накопители сегодня настолько медленны по сравнению с процессорами, что чтение из сжатых файловых систем происходит быстрее (по крайней мере, здесь ZFS), если у вас уже нет загрузки процессора на процессор больше 1. - person Feuermurmel; 10.02.2020
comment
Спасибо. Мне не терпится узнать, что скажут читатели 2030 года. Есть ли значок для троллинга комментария десятилетней давности? Если нет, могу я предложить Through the years за это достижение? - person No Refunds No Returns; 12.02.2020

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

person David Thornley    schedule 05.02.2010

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

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

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

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

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

person Community    schedule 28.07.2010