2010-01-12 5 views
4

Je cherche une bibliothèque de compression générale qui supporte l'accès aléatoire pendant 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.Toute bibliothèque de compression possible?

Bien sûr, je peux compresser chaque article individuellement, mais cela ne donnera pas beaucoup de taux de compression. J'ai entendu dire que le fichier compressé de LZO se compose de plusieurs morceaux qui peuvent être décompressés séparément, mais je n'ai pas trouvé de documentation API + pour cela. Je peux aussi utiliser le mode Z_FULL_FLUSH dans zlib, mais existe-t-il d'autres alternatives?

+1

Si vous voulez un accès aléatoire, vous devrez probablement découper l'entrée d'une façon ou d'une autre. Quelle meilleure façon de découper est là que par article? –

+0

... que pratiquement toutes les bibliothèques de compression supportent, l'article correspondant à une entrée de fichier. –

+1

Aussi ... Je doute qu'il y aura une grande différence entre le taux de compression pour les articles individuellement et le taux de compression pour l'ensemble, car ils devraient avoir essentiellement le même ratio d'occurrences de lettre. Avez-vous évalué cette réclamation? –

Répondre

3

xz -les fichiers de format supportent un index, bien que par défaut l'index ne soit pas utile. Mon compresseur, pixz, crée des fichiers contenant un index utile. Vous pouvez utiliser les fonctions de la bibliothèque liblzma pour trouver quel bloc de données xz correspond à quel emplacement dans les données non compressées.

+1

On dirait un projet prometteur. Merci. –

0

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 auriez la partie "cherchable" ainsi que la compression. La surcharge du processeur sera gérée pour vous avec des temps d'accès imprévisibles.

+0

Je préférerais une bibliothèque portable parmi différents systèmes d'exploitation. Le système de fichiers compressé est certainement une solution, mais est-ce que cela fonctionne bien (en termes de vitesse et de mémoire) sous un accès aléatoire? –

+0

vous échangez de l'espace pour la vitesse. Coûts de compression. –

1

DotNetZip est une bibliothèque d'archives zip pour .NET. En utilisant DotNetZip, vous pouvez référencer des entrées particulières dans le zip de manière aléatoire, et les décomprimer dans le désordre, et retourner un flux qui décompresse lorsqu'il extrait une entrée. Avec l'avantage de ces fonctionnalités, DotNetZip a été utilisé dans l'implémentation d'un Virtual Path Provider for ASP.NET, qui fait exactement ce que vous décrivez - il sert tout le contenu pour un site web particulier à partir d'un fichier ZIP compressé. Vous pouvez également faire des sites Web avec des pages dynamiques (ASP.NET).

ASP.NET ZIP Virtual Path Provider, based on 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; 
     } 
    } 
} 

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

J'utilise MS Windows Vista, malheureusement, et je peux envoyer l'explorateur de fichiers dans des fichiers zip comme s'ils étaient des fichiers normaux. Vraisemblablement ça marche toujours sur 7 (que j'aimerais voir). Je pense que je l'ai fait avec l'utilitaire correspondant sur Ubuntu, aussi, mais je ne suis pas sûr. Je pourrais aussi le tester sur Mac OSX, je suppose.

0

Si les articles individuels sont trop courts pour obtenir un taux de compression correct, l'approche la plus simple consiste à télécharger un lot d'articles sur Wikipédia - disons, 12 articles à la fois ou de nombreux articles à remplir un mégaoctet. Puis compresser chaque lot indépendamment. En principe, cela donne une meilleure compression que de comprimer chaque article individuellement, mais une compression plus mauvaise que la compression solide de tous les articles ensemble. L'extraction de l'article n ° 12 à partir d'un lot compressé nécessite la décompression de l'ensemble du lot (puis le rejet des 11 premiers articles), mais cela reste beaucoup, beaucoup plus rapide que la décompression de la moitié de Wikipédia. De nombreux programmes de compression décomposent le flux d'entrée en une séquence de "blocs" et compressent chaque bloc à partir de zéro, indépendamment des autres blocs. Vous pouvez aussi bien choisir une taille de lot sur la taille d'un bloc - les plus gros lots n'obtiendront pas de meilleur taux de compression et prendront plus de temps à se décompresser.

J'ai expérimenté plusieurs méthodes pour faciliter le décodage d'une base de données compressée au milieu.Hélas, jusqu'à présent, les techniques "intelligentes" que j'ai appliquées ont encore un taux de compression plus faible et nécessitent 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

4

pour Compression compressible compilable sur gzip, il y a dictzip du serveur dict et sgzip du kit sleuth

pas e que vous ne pouvez pas écrire dans l'un d'entre eux et que vous pouvez le lire de n'importe quelle façon

1

bgzf est le format utilisé en génomique. Il fait partie de la bibliothèque C de samtools et n'est qu'un simple hack autour de gzip. Vous pouvez probablement le réécrire vous-même si vous ne voulez pas utiliser l'implémentation de samtools C ou l'implémentation de picard java. Biopython implémente un variant python.

+0

Il ressemble à une bibliothèque de wrapper simple au-dessus de zlib. Les données sont divisées en blocs de 64k et compressées indépendamment. Mais je suppose que l'on peut obtenir un meilleur taux de compression. –

+0

C'est juste un simple hack mais il fonctionne hors de la boîte et a un outil de ligne de commande utile. Vous pouvez probablement obtenir une meilleure compression, mais c'est quelque chose qui fonctionne maintenant. – Max

Questions connexes