6 Stimmen

Jede durchsuchbare Kompressionsbibliothek?

Ich bin auf der Suche nach einer allgemeinen Kompressionsbibliothek, die zufälligen Zugriff während der Dekompression unterstützt. Ich möchte Wikipedia in ein einziges komprimiertes Format komprimieren und gleichzeitig möchte ich einzelne Artikel daraus dekomprimieren/extrahieren.

Natürlich kann ich jeden Artikel einzeln komprimieren, aber das wird nicht viel Kompressionsrate ergeben. Ich habe gehört, dass eine LZO-komprimierte Datei aus vielen Chunks besteht, die separat dekomprimiert werden können, aber ich habe keine API+Dokumentation dafür gefunden. Ich kann auch den Z_FULL_FLUSH-Modus in zlib verwenden, aber gibt es noch eine bessere Alternative?

6voto

vasi Punkte 1057

xz -Formatdateien unterstützen einen Index, obwohl dieser standardmäßig nicht nützlich ist. Mein Kompressor, pixz erzeugt Dateien, die einen nützlichen Index enthalten. Sie können die Funktionen der liblzma-Bibliothek verwenden, um herauszufinden, welcher Block von xz-Daten welcher Stelle in den unkomprimierten Daten entspricht.

4voto

Dan D. Punkte 70371

Für suchbare Kompression, die auf gzip aufbaut, gibt es dictzip vom dict-Server und sgzip von sleuth kit

Beachten Sie, dass Sie in keine der beiden Dateien schreiben können und dass seekable in irgendeiner Weise liest

1voto

Cheeso Punkte 184210

DotNetZip ist eine Zip-Archiv-Bibliothek für .NET.

Mit DotNetZip können Sie auf bestimmte Einträge in der ZIP-Datei nach dem Zufallsprinzip verweisen, sie in anderer Reihenfolge dekomprimieren und einen Stream zurückgeben, der beim Extrahieren eines Eintrags dekomprimiert wird.

Mit dem Nutzen dieser Funktionen wurde DotNetZip bei der Implementierung eines Virtueller Pfadanbieter für ASP.NET die genau das tut, was Sie beschreiben - sie liefert den gesamten Inhalt einer bestimmten Website aus einer komprimierten ZIP-Datei. Sie können auch Websites mit dynamischen Seiten (ASP.NET-Seiten) erstellen.

ASP.NET ZIP Virtual Path Provider, basierend auf DotNetZip

Der wichtige Code sieht wie folgt aus:

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;
        }
    }
}

Und VirtualFile ist wie folgt definiert:

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();
        }
    }
}

1voto

Max Punkte 1007

Bgzf ist das in der Genomik verwendete Format. http://biopython.org/DIST/docs/api/Bio.bgzf-module.html

Es ist Teil der samtools C-Bibliothek und eigentlich nur ein einfacher Hack um gzip herum. Sie können es wahrscheinlich selbst umschreiben, wenn Sie die C-Implementierung von samtools oder die Java-Implementierung von picard nicht verwenden wollen. Biopython implementiert eine Python-Variante.

0voto

Sie haben Ihr Betriebssystem nicht angegeben. Wäre es möglich, Ihre Datei in einem vom Betriebssystem verwalteten komprimierten Verzeichnis zu speichern? Dann hätten Sie sowohl den "suchbaren" Teil als auch die Komprimierung. Der CPU-Overhead wird mit unvorhersehbaren Zugriffszeiten für Sie erledigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X