2009-12-27 27 views
6

Selon la spécification de gz la taille de fichier est enregistrée dans les 4 derniers octets d'un fichier .gz.obtenir la taille de fichier de très grand fichier .gz sur une plate-forme 64 bits

J'ai créé 2 fichiers avec

dd if=/dev/urandom of=500M bs=1024 count=500000 
dd if=/dev/urandom of=5G bs=1024 count=5000000 

Je les gziped

gzip 500M 5G 

J'ai vérifié les 4 derniers octets faisant

tail -c4 500M|od -I  (returns 512000000 as expected) 
tail -c4 5G|od -I  (returns 825032704 as not expected) 

Il semble que frapper la barrière 32bit invisible, rend la valeur écrite dans le ISIZE complètement absurde. Ce qui est plus ennuyeux que s'ils avaient utilisé un bit d'erreur à la place.

Est-ce que quelqu'un connaît un moyen d'obtenir la taille de fichier .gz non compressé à partir du fichier .gz sans l'extraire?

grâce

spécification

: http://www.gzip.org/zlib/rfc-gzip.html

modifier: si quelqu'un pour l'essayer, vous pouvez utiliser/dev/zero au lieu de/dev/urandom

+0

'dd seek = 10G if =/dev/zero of = out.dat count = 0' est plus pratique pour le plus – nodakai

Répondre

8

Il n'y a pas un. La seule façon d'obtenir la taille exacte d'un flux compressé est d'aller le décompresser (même si vous écrivez tout dans/dev/null et ne comptez que les octets).

est utile de noter que iSize est défini comme

iSize (Input SIZE)
Cette contient la taille de l'entrée (non compressé) d'origine
données modulo 2^32.

dans le gzip RFC il est donc pas vraiment briser à la barrière 32 bits, ce que vous voyez est le comportement attendu.

2

Je ne l'ai pas essayé avec un fichier de la taille vous avez mentionné, mais je trouve souvent le non compressé taille d'un fichier .gz avec

zcat file.gz | wc -c 

lorsque je ne veux pas laisser le fichier non compressé ou que je le compresse de nouveau.

De toute évidence, les données ne sont pas compressées, mais sont ensuite redirigées vers wc.

Cela vaut la peine d'essayer, de toute façon.

EDIT: Quand j'ai essayé de créer un fichier 5G avec des données de/dev/random il a produit un fichier 5G de taille 5120000000, bien que mon gestionnaire de fichiers a rapporté ce que 4,8g

Puis je l'ai compressé avec gzip 5G , les résultats 5G.gz était la même taille (pas beaucoup de compression de aléatoire données).

Puis zcat 5G.gz | wc -c a indiqué la même taille que le fichier d'origine: 5120000000 octets. Donc, ma suggestion semblait avoir fonctionné pour ce procès, de toute façon.

Merci pour attendre

+0

Oui merci des systèmes de fichiers, mais ma question était plus dans le sens de. Comment obtenir la taille de fichier non compressée sans réellement effectuer une décompression. Pour les fichiers de taille inférieure à 32 bits. Vous pouvez simplement extraire les 4 derniers octets. Ce n'est pas possible pour les fichiers plus volumineux, et comme vous l'avez fait, le seul moyen est de faire une décompression. – monkeyking

+0

Mais ma méthode a effectué une décompression qui n'affectait pas le fichier compressé d'origine et n'a pas créé de fichier décompressé supplémentaire. Il n'y aurait pas de nettoyage après. Et je pense qu'il vaut la peine de noter que la réponse que vous avez acceptée a dit que la décompression était la seule façon d'obtenir la taille exacte. Il est logique que * la seule façon de savoir ce qu'il y a dans la boîte est de l'ouvrir *. – pavium

+0

Oui, cela n'affectait pas le fichier d'origine, mais mon souci n'était pas de "ne pas toucher" le fichier, mais simplement un problème de vitesse. Si je veux allouer un tableau pour l'ensemble des données, alors je devrais connaître la taille. Cela nécessite une décompression, suivie d'une autre décompression pour la copie de données actuelle. Ceci n'est pas nécessaire si le fichier est plus petit que 2.1 gig. std gunzip peut également décomprimer à stdout, faisant gunzip -c | wc -c Mais merci pour vos commentaires :) – monkeyking

0

gzip a une option -l:

 -l --list 
      For each compressed file, list the following fields: 

       compressed size: size of the compressed file 
       uncompressed size: size of the uncompressed file 
       ratio: compression ratio (0.0% if unknown) 
       uncompressed_name: name of the uncompressed file 

      The uncompressed size is given as -1 for files not in gzip format, such as compressed .Z files. To 
      get the uncompressed size for such a file, you can use: 

       zcat file.Z | wc -c 

      In combination with the --verbose option, the following fields are also displayed: 

       method: compression method 
       crc: the 32-bit CRC of the uncompressed data 
       date & time: time stamp for the uncompressed file 

      The compression methods currently supported are deflate, compress, lzh (SCO compress -H) and pack. 
      The crc is given as ffffffff for a file not in gzip format. 

      With --name, the uncompressed name, date and time are those stored within the compress file if 
      present. 

      With --verbose, the size totals and compression ratio for all files is also displayed, unless some 
      sizes are unknown. With --quiet, the title and totals lines are not displayed. 
+0

Cette solution fonctionne uniquement pour un fichier disque, pas un flux (la question d'origine n'a pas spécifié de flux, donc, à cet égard, c'est une réponse viable). Malheureusement, pour les tailles de fichier supérieures à 2^32-1 octets, la taille non compressée est affichée modulo 2^32 et n'est donc pas fiable. – Curt