Question

Je suis à la recherche d'une bibliothèque générale de compression qui prend en charge l'accès aléatoire lors de la décompression. Je veux compresser wikipedia en un seul format compressé et en même temps je veux décompresser / extraire des articles individuels de celui-ci.

Bien sûr, je peux compresser chaque article individuellement, mais cela ne donnera pas beaucoup de rapport compression. J'ai entendu fichier compressé LZO se compose de nombreux morceaux qui peuvent être décompressés séparément, mais je ne l'ai pas trouvé API + documentation pour cela. Je peux aussi utiliser le mode Z_FULL_FLUSH dans zlib, mais est-il une autre meilleure alternative?

Était-ce utile?

La solution

XZ fichiers -Formatez prennent en charge un index, mais par défaut, l'index n'est pas utile. Mon compresseur, pixz , crée des fichiers qui ne contiennent un index utile. Vous pouvez utiliser les fonctions dans la bibliothèque de liblzma pour trouver bloc de données xz correspond à quel emplacement dans les données non compressées.

Autres conseils

pour la construction de compression adressable sur gzip, il est dictzip du serveur dict et sgzip du kit Sleuth

Notez que vous ne pouvez pas écrire à l'une de ces et comme adressable est la lecture de quelque façon

DotNetZip est une bibliothèque d'archives zip pour .NET.

Utilisation DotNetZip, vous pouvez faire référence à des entrées particulières dans le zip au hasard, et peut les décomprimer hors d'usage, et peut renvoyer un flux qui décompresse comme il extrait une entrée.

Avec l'avantage de ces caractéristiques, DotNetZip a été utilisé dans la mise en œuvre d'un fournisseur de chemin virtuel pour ASP .NET , qui fait exactement ce que vous décrivez - il sert tout le contenu d'un site Web particulier d'un fichier compressé ZIP. Vous pouvez également faire des sites Web avec des pages dynamiques (ASP.NET) pages.

ASP.NET ZIP fournisseur de chemin virtuel , sur la base DotNetZip

Le code importante ressemble à ceci:

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 est défini comme ceci:

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 est le format utilisé en génomique. http://biopython.org/DIST/docs/api/Bio.bgzf -module.html

Il fait partie de la bibliothèque samtools C et vraiment juste un simple bidouille autour gzip. Vous pouvez probablement réécrire vous-même si vous ne voulez pas utiliser la samtools C mise en œuvre ou la mise en œuvre java picard. Biopython met en œuvre une variante de python.

Vous n'avez pas spécifié votre système d'exploitation. Serait-il possible de stocker votre fichier dans un répertoire compressé géré par le système d'exploitation? Ensuite, vous avez la partie « adressable », ainsi que la compression. La surcharge du CPU pour vous être manipulé avec des temps d'accès imprévisibles.

J'utilise MS Windows Vista, malheureusement, et je peux envoyer l'explorateur de fichiers dans les fichiers zip comme si elles étaient des fichiers normaux. On peut supposer que cela fonctionne encore sur 7 (que je voudrais être sur). Je pense que je l'ai fait avec l'utilitaire sur Ubuntu, aussi, mais je ne suis pas sûr correspondant. Je pourrais aussi le tester sur Mac OSX, je suppose.

Si certains articles sont trop courts pour obtenir un taux de compression décent, l'approche de la prochaine plus simple est de archivez un lot d'articles de Wikipedia - disons, 12 articles à la fois, ou cependant de nombreux articles qu'il faut pour remplir une méga-octet. Ensuite compresser chaque lot indépendamment.

En principe, cela donne une meilleure compression que la compression que chaque article individuellement, mais pire compression que la compression solide de tous les articles ensemble. Article n ° 12 l'extraction d'un lot compressé nécessite décompressé le lot entier (puis jeter les 11 premiers articles de là), mais qui est encore beaucoup, beaucoup plus vite que la moitié de Wikipedia décompresser.

De nombreux programmes de compression briser le flux d'entrée en une séquence de « blocs », et comprimer chaque bloc à partir de zéro, indépendamment des autres blocs. Vous pourriez aussi bien choisir une taille de lot de la taille d'un bloc -. Lots plus importants n'obtiendront pas meilleur taux de compression, et prendra plus de temps à décomprimer

Je l'ai expérimenté plusieurs façons de le rendre plus facile de commencer le décodage d'une base de données compressées au milieu. Hélas, jusqu'à présent, les techniques « intelligentes » j'ai postulé ont encore pire taux de compression et prennent plus d'opérations pour produire une section décodée que l'approche « batch » beaucoup plus simple.

Pour des techniques plus sophistiquées, vous pouvez regarder

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top