7
votes

Obtenez le fichier de fichiers de très grand fichier .gz sur une plate-forme 64 bits

Selon la spécification de GZ, le fichierizeize est enregistré dans les derniers filets d'un fichier .gz.

J'ai créé 2 fichiers avec xxx i gzipède leur xxx

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

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

Est-ce que quelqu'un sait un moyen d'obtenir le fichier de fichiers non compressé .gz sans extraire?

Merci

Spécification: http://www.gzip.org/zlib /RFC-GZIP.HTML

EDIT: Si quelqu'un pour l'essayer, vous pouvez utiliser / dev / zéro au lieu de / dev / urandom


1 commentaires

dd recherche = 10g if = / dev / zéro de = out.dat compte = 0 est plus pratique pour la plupart des systèmes de fichiers


3 Réponses :


3
votes

Je n'ai pas essayé cela avec un fichier de la taille que vous avez mentionnée, mais je trouve souvent la taille non compressée de fichier .gz avec xxx

quand Je ne veux pas laisser le fichier non compressé couché ou la peine de la compresser à nouveau.

évidemment, les données sont non compressées, mais sont ensuite pipiées à WC .

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

EDIT: Lorsque j'ai essayé de créer un fichier 5G avec des données de / dev / aléatoires, il a produit un fichier 5G de la taille 5120000000, bien que mon gestionnaire de fichiers ait signalé ceci comme 4,8 g

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

alors zcat 5g.gz | WC -C a signalé la même taille que le fichier d'origine: 5120000000 octets. Donc, ma suggestion semblait avoir travaillé pour ce procès, de toute façon.

merci pour l'attente


4 commentaires

Oui merci, mais ma question était plus dans le sens de. Comment puis-je obtenir les fichiers non compressés sans faire de décompression. Pour les fichiers plus petits que 32 bits. Vous pouvez simplement extraire les 4 derniers octets. Cela n'est pas possible pour les fichiers plus gros et comme vous l'avez fait, le seul moyen est de faire une décompression.


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


Oui, cela n'a pas affecté le fichier d'origine, mais ma préoccupation ne faisait pas "ne pas toucher" le fichier, mais simplement un problème de vitesse. Si je veux affecter un tableau pour l'ensemble des données, je devrais connaître la taille. Cela nécessite de faire une décompression, suivie d'une autre décompression pour la datacopie réelle. Ceci n'est pas nécessaire si le fichier est inférieur à 2,1 gig. std gunzip peut également décompresser à stdout, faire des fichiers gunzip -c | wc -c mais merci pour votre entrée :)


Tous les commentaires avaient mis à part: si tout le reste échoue une solution pratique.



8
votes

Il n'y en a pas.

Le seul moyen d'obtenir la taille exacte d'un flux compressé est de le décompresser et de le décompresser (même si vous écrivez tout sur / dev / null et comptez simplement les octets).

sa valeur notable que l'isisé est définie comme

isize (taille d'entrée)
Ceci contient la taille de l'entrée d'origine (non compressée)
Data MODULO 2 ^ 32.

dans le gzip RFC afin que ce ne soit pas réellement rupture < / em> à la barrière 32 bits, ce que vous voyez est un comportement attendu.


0 commentaires

0
votes

gzip a une option -l -l: xxx


1 commentaires

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