Frage

Ich suche eine allgemeine Kompression Bibliothek, die während der Dekompression Random Access unterstützt. Ich möchte Kompresse wikipedia in einem einzigen komprimierten Format und zur gleichen Zeit ich zu dekomprimieren wollen / extrahieren einzelne Artikel daraus.

Natürlich kann ich jeden Artikel einzeln komprimieren, aber das wird nicht viel Verdichtungsverhältnis geben. Ich habe LZO komprimierte Datei besteht aus vielen Stücken gehört, die getrennt dekomprimiert werden kann, aber ich habe nicht API + Dokumentation für die herausgefunden haben. Ich kann auch den Z_FULL_FLUSH Modus in zlib verwenden, aber ist es eine andere bessere Alternative?

War es hilfreich?

Lösung

xz -Format-Dateien unterstützen, einen Index, obwohl standardmäßig der Index nicht nützlich ist. Mein Kompressor, pixz , erstellt Dateien, die einen nützlichen Index enthalten. Sie können die Funktionen in der liblzma Bibliothek verwenden, welchen Block von xz Daten entsprechen der Standort in den unkomprimierten Daten zu finden.

Andere Tipps

für seekable Komprimierung build auf gzip, ist es dictzip vom dict-Server und sgzip von Sleuth Kit

Beachten Sie, dass Sie nicht zu einer dieser beiden und als seekable schreiben liest irgendeine Art und Weise

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

Mit DotNetZip können Sie bestimmte Einträge in der Zip zufällig verweisen, und sie können, um dekomprimieren aus und kann einen Strom zurückgeben, dekomprimiert, wie es einen Eintrag extrahiert.

Mit dem Nutzen dieser Merkmale hat DotNetZip innerhalb der Implementierung eines Virtual Path Provider für ASP verwendet .NET , das ist genau das, was Sie beschreiben - es dient den gesamten Inhalt für eine bestimmte Website aus einer komprimierten ZIP-Datei. Sie können auch Websites tun mit dynamischen Seiten (ASP.NET) Seiten.

ASP.NET ZIP Virtual Path Provider , basierend auf DotNetZip

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

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

Es ist Teil der samtools C-Bibliothek und wirklich nur eine einfache Hack um gzip. Sie können sich wahrscheinlich neu zu schreiben es selbst, wenn Sie die samtools C-Implementierung oder die picard Java-Implementierung nicht verwendet werden sollen. Biopython implementiert eine Python-Variante.

Sie haben Ihr Betriebssystem nicht angegeben. Wäre es möglich, die Dateien in einem komprimierten Verzeichnis vom Betriebssystem verwaltet zu speichern? Dann müßten Sie das „durchsuchbar“ -Teil sowie die Kompression. Der CPU-Overhead wird für Sie mit unvorhersehbaren Zugriffszeiten behandelt werden.

Ich bin mit MS Windows Vista, leider, und ich kann die Datei-Explorer in Zip-Dateien senden, als ob sie normale Dateien waren. Vermutlich funktioniert es immer noch auf 7 (die ich auf sein möchte). Ich glaube, ich habe mit dem entsprechenden Dienstprogramm auf Ubuntu, getan, dass auch, aber ich bin mir nicht sicher. Ich könnte auch auf Mac OSX testen, nehme ich an.

Wenn einzelne Artikel zu kurz sind ein anständiges Kompressionsverhältnis zu erhalten, die nächste einfachste Ansatz ist eine Charge von Wikipedia-Artikeln Teer bis - sagen wir, 12 Artikel zu einer Zeit, oder wie viele Artikel es füllen dauert Megabyte. Dann unabhängig jede Charge komprimieren.

Im Prinzip gibt, dass eine bessere Kompression als als jeden Artikel einzeln komprimiert, aber schlechter Kompression als feste Kompression aller Artikel zusammen. Extrahieren Artikel # 12 aus einem komprimierten Charge erfordert die gesamte Charge Dekomprimieren (und dann die ersten 11 Artikel wegzuwerfen), aber das ist immer noch viel, viel schneller als die Hälfte der Wikipedias dekomprimieren.

viele Komprimierungsprogramme brechen den Eingabestrom in eine Folge von „Blöcken“, und Komprimieren jeden Block von Grunde auf, unabhängig von den anderen Blöcken. Genauso gut könnte man eine Chargengröße über die Größe eines Blocks holen -. Größere Chargen keine bessere Kompressionsrate erhalten wird, und wird länger dauern, zu dekomprimieren

Ich habe mit mehreren Möglichkeiten experimentiert, um es einfacher zu starten eine komprimierte Datenbank in der Mitte Decodierung. Ach, so weit die „clever“ Techniken, die ich haben noch schlimmes Verdichtungsverhältnis angewandt habe und mehr Operationen nehmen einen dekodierten Abschnitt als das viel einfacher „Batch“ Ansatz zu erzeugen.

Für anspruchsvollere Techniken, könnte man schauen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top