Question

Je voudrais pouvoir faire accès aléatoire dans un fichier gzip. Je peux me permettre de faire quelques pré-traitement sur elle (par exemple, construire une sorte d'index), à condition que le résultat de la pré-traitement est beaucoup plus petit que le fichier lui-même.

Un conseil?

Mes pensées étaient:

  • Hack sur une implémentation existante gzip et sérialiser son état décompresseur tous, disons, 1 méga-octet de données compressées. Puis faire un accès aléatoire, désérialiser l'état de décompresseur et de lire de la limite de méga-octet. Cela semble difficile, d'autant plus que je travaille avec Java et je ne pouvais pas trouver une implémentation gzip pure java: (
  • recompresser le fichier en morceaux de 1Mo et faire comme ci-dessus. Ceci a pour inconvénient de doubler l'espace disque requis.
  • Ecrire un analyseur simple du format gzip qui ne fait pas de décompression et détecte seulement et indices bloquer les frontières (s'il y a des blocs même: Je ne l'ai pas encore lu la description du format gzip)
Était-ce utile?

La solution

Regardez à ce lien (exemple de code C).

/* zran.c -- example of zlib/gzip stream indexing and random access
...

Gzip est zlib juste avec une enveloppe.

Autres conseils

BGZF format de fichier compatible avec GZIP a été développé par les biologistes.

  

(...) L'avantage de   BGZF sur gzip classique est que   BGZF permet de chercher sans avoir   pour parcourir l'ensemble des fichiers à   la position recherchée.

http: / /picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/ , jetez un oeil à BlockCompressedOutputStream et BlockCompressedInputStream.java

question intéressante. Je ne comprends pas pourquoi votre 2ème option (fichier recompresser en morceaux) doublerait l'espace disque. Il me semble que ce serait la même chose, moins une petite quantité de frais généraux. Si vous avez le contrôle sur la pièce de compression, alors cela semble être la bonne idée.

Peut-être ce que vous voulez dire est que vous ne pouvez pas contrôler l'entrée, et il serait donc doubler.

Si vous pouvez le faire, j'imaginer la modélisation comme une classe CompressedFileStream qui utilise comme magasin de support, une série de blobs 1Mo de compression par gzip. Lors de la lecture, un seek () sur le flux se déplacerait à la blob appropriée et décomprimer. A Lire () après la fin d'un blob causerait le flux d'ouvrir la prochaine blob.

ps: GZIP est décrit dans IETF RFC 1952 , mais il utilise deflate pour le format de compression. Il n'y aurait aucune raison d'utiliser l'élaboration de GZIP si vous mis en œuvre cette classe CompressedFileStream comme je l'ai imaginé.

FWIW: J'ai développé un outil de ligne de commande sur zlib de < em> zran.c code source qui crée des index pour les fichiers gzip: https: // github.com/circulosmeos/gztool

Il peut même créer un index pour un fichier gzip encore en croissance (par exemple un journal créé par rsyslog directement au format gzip) réduisant ainsi dans la pratique à zéro le temps de création d'index. Voir l'option -S ( Supervise ).

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