web-dev-qa-db-fra.com

Comment puis-je gérer un fichier compressé sans en lire tout le contenu?

Je veux émuler les fonctionnalités de gzcat | queue -n.

Cela serait utile lorsque les fichiers sont énormes (de quelques Go ou plus). Puis-je suivre les dernières lignes d'un tel fichier sans le lire depuis le début? Je doute que cela ne soit pas possible car je suppose que pour gzip, l'encodage dépend de tout le texte précédent.

Mais j'aimerais quand même savoir si quelqu'un a essayé de faire quelque chose de similaire - peut-être en recherchant un algorithme de compression qui pourrait fournir une telle fonctionnalité.

38
baskin

Non, tu ne peux pas. L'algorithme zipping fonctionne sur les flux et adapte ses codages internes à ce que le flux contient pour atteindre son taux de compression élevé.

Sans connaître le contenu du flux avant un certain point, il est impossible de savoir comment procéder à la décompression à partir de ce moment.

Tout algorithme permettant de décompresser des parties arbitraires nécessitera plusieurs passages sur les données pour les compresser.

38
Ben S

BGZF est utilisé pour créer des fichiers BAM compressés gzip index créés par Samtools. Ceux-ci sont accessibles au hasard.

http://samtools.sourceforge.net/

7
Jeremy Leipzig

Si vous avez le contrôle sur ce qui entre dans le fichier, si vous ressemblez à un fichier Zip, vous pouvez stocker des morceaux de taille prédéterminée avec des noms de fichiers dans un ordre numérique croissant, puis décompresser le dernier morceau/fichier.

3
Jared Updike

Si c'est une option, alors bzip2 pourrait être un meilleur algorithme de compression à utiliser à cette fin.

Bzip2 utilise un schéma de compression de bloc. En tant que tel, si vous prenez un morceau de la fin de votre fichier dont vous êtes sûr qu'il est assez gros pour contenir tout le dernier morceau, vous pouvez le récupérer avec bzip2recover.

La taille du bloc est sélectionnable au moment de l'écriture du fichier. En fait, c'est ce qui se produit lorsque vous définissez -1 (ou --fast) sur -9 (ou --best) en tant qu'options de compression, ce qui correspond à des tailles de bloc de 100 000 à 900 000. La valeur par défaut est 900k.

Les outils de ligne de commande bzip2 ne vous donnent pas un moyen convivial de faire cela avec un pipeline, mais étant donné que bzip2 n'est pas orienté en flux, ce n'est peut-être pas surprenant.

1
mc0e

zindex crée et interroge un index sur un fichier texte compressé basé sur des lignes de manière économe en temps et en espace.

https://github.com/mattgodbolt/zindex

1
Jeremy Leipzig

Un exemple de format d'accès pseudo-aléatoire totalement compatible avec gzip est dictzip :

Pour la compression, le fichier est divisé en "morceaux" de données, chacun le morceau est inférieur à 64 Ko. [...]

Pour effectuer un accès aléatoire sur les données, le décalage et la longueur du fichier les données sont fournies aux routines de la bibliothèque. Ces routines déterminent le morceau dans lequel les données désirées commencent et décompresse ce morceau . Les morceaux consécutifs sont décompressés si nécessaire. "

0
Kirill Bulygin