Domanda

Sto cercando una libreria di compressione generale, che supporta l'accesso casuale durante la decompressione. Voglio comprimere wikipedia in un unico formato compresso e allo stesso tempo che voglio per decomprimere / estrarre singoli articoli da esso.

Naturalmente, posso comprimere ogni articolo individualmente, ma questo non darò rapporto di compressione molto. Ho sentito file compresso LZO è composto da molti pezzi che possono essere decompressi separatamente, ma non ho trovato fuori API + documentazione per questo. Posso anche usare la modalità Z_FULL_FLUSH in zlib, ma c'è qualche altro un'alternativa migliore?

È stato utile?

Soluzione

XZ -format file supportano un indice, anche se di default l'indice non è utile. Il mio compressore, pixz , crea i file che contengono un indice utile. È possibile utilizzare le funzioni nella libreria liblzma per trovare quale blocco di dati XZ corrisponde a quale posizione nella dati non compressi.

Altri suggerimenti

per costruire la compressione posizionabili su gzip, c'è dictzip dal server dict e sgzip da Sleuth Kit

Si noti che non si può scrivere a uno di questi e, come seekable è una lettura alcun modo

DotNetZip è una libreria archivio zip per .NET.

Utilizzando DotNetZip, è possibile fare riferimento le voci particolari nel zip in modo casuale, e li potete decomprimere fuori ordine, e possibile restituire un torrente che decomprime in quanto estrae una voce.

Con il beneficio di quelle caratteristiche, DotNetZip è stata utilizzata nell'ambito dell'attuazione di un Provider Virtual Path per ASP NET , che fa esattamente ciò che si descrive - serve tutto il contenuto di un particolare sito web da un file ZIP compresso. È anche possibile fare siti web con pagine dinamiche pagine (ASP.NET).

ASP.NET NPA provider di percorso virtuale , sulla base di DotNetZip

Il codice importante è simile al seguente:

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

E VirtualFile si definisce in questo modo:

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 è il formato utilizzato nel campo della genomica. http://biopython.org/DIST/docs/api/Bio.bgzf -module.html

E 'parte della libreria samtools C e in realtà solo un semplice hack in giro gzip. Probabilmente si può ri-scrivere voi stessi se non si desidera utilizzare l'implementazione samtools C o l'implementazione Java Picard. Biopython implementa una variante pitone.

Non hai specificato il sistema operativo. Sarebbe possibile memorizzare il file in una directory compressa gestito dal sistema operativo? Poi si avrebbe la parte "ricercabile", così come la compressione. Il sovraccarico della CPU verrà gestito per voi con tempi di accesso imprevedibili.

Sto utilizzando MS Windows Vista, purtroppo, e posso inviare il file explorer in file zip come se fossero file normali. Presumibilmente funziona ancora su 7 (che mi piacerebbe essere su). Penso che ho fatto che con la corrispondente utilità su Ubuntu, anche, ma non sono sicuro. Potrei anche testarlo su Mac OSX, suppongo.

Se i singoli articoli sono troppo brevi per ottenere un rapporto di compressione decente, l'approccio di nuova più semplice è quello di tar di una partita di articoli di Wikipedia - dicono, 12 articoli per volta, o comunque molti articoli che serve per riempire un megabyte. Quindi comprimere in modo indipendente ogni lotto.

In linea di principio, che dà una compressione migliore rispetto a comprimere ogni articolo individualmente, ma peggio di compressione solida la compressione di tutti gli articoli insieme. Estrazione articolo # 12 da un lotto compresso richiede decomprimere l'intero lotto (e poi gettare i primi 11 articoli di distanza), ma che è ancora molto, molto più veloce di decompressione della metà di Wikipedia.

Molti programmi di compressione interrompono il flusso di input in una sequenza di "blocchi", e comprimono ogni blocco da zero, indipendentemente dagli altri blocchi. Si potrebbe anche scegliere una dimensione del lotto delle dimensioni di un blocco -. Lotti più grandi non avranno alcun rapporto di compressione migliore, e ci vorrà più tempo per decomprimere

Ho sperimentato con diversi modi per rendere più facile per iniziare a decodificare un database compresso in mezzo. Ahimè, finora le tecniche "intelligenti" che ho applicato ancora hanno rapporto di compressione peggio e prendere più operazioni per produrre una sezione decodificato rispetto all'approccio molto più semplice "batch".

Per le tecniche più sofisticate, si potrebbe guardare a

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top