2009-12-27 11 views
6

Zgodnie z opisem pliku gz, rozmiar pliku jest zapisywany w ostatnich 4 bajtach pliku .gz.pobierz plik bardzo dużego pliku .gz na platformie 64-bitowej

Stworzyłem 2 pliki z

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

I gziped je

gzip 500M 5G 

Sprawdziłem ostatnie 4 bajty robi

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

Wydaje się, że uderzenie niewidzialną barierę 32bit, sprawia, że ​​wartość zapisana w ISIZE jest kompletnie bez sensu. Co jest bardziej denerwujące, niż gdyby użyli zamiast tego trochę błędów.

Czy ktoś wie, w jaki sposób uzyskać nieskompresowane pliki .gz z pliku .gz bez ich rozpakowywania?

dzięki

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

edit: jeśli ktoś go wypróbować, można użyć/dev/zero zamiast/dev/urandom

+0

'dd seek = 10G if =/dev/zero of = out.dat count = 0' jest bardziej przydatny dla większości systemów plików – nodakai

Odpowiedz

8

Nie ma ani jednego.

Jedynym sposobem uzyskania dokładnego rozmiaru skompresowanego strumienia jest jego rozpakowanie (nawet jeśli wszystko zapisujesz w/dev/null i po prostu policzysz bajty).

Warto zauważyć, że ISIZE jest zdefiniowana jako

ISIZE (wielkość wejściowa)
zawiera rozmiaru pierwotnego (nieskompresowany) danych wejściowych
modulo 2^32.

w gzip RFC więc nie jest rzeczywiście łamanie na barierę 32-bitowym, co widzisz jest oczekiwane zachowanie.

2

nie próbowałem to z plik o wielkości wspomniałeś, ale często znaleźć nieskompresowanego rozmiar pliku .gz z

zcat file.gz | wc -c 

, gdy nie chcę pozostawić nieskompresowanego pliku, lub zawracać mu głowę, aby ponownie go skompresować.

Oczywiście dane są nieskompresowane, ale są przesyłane do wc.

Warto spróbować, tak czy inaczej.

EDIT: Kiedy próbowałem tworzenia pliku 5G z danymi z/dev/random wyprodukowany plik 5G wielkości 5120000000, chociaż mój menedżer plików zgłoszone to jako 4,8 g

Wtedy sprężone go gzip 5G , wyniki 5G.gz były tego samego rozmiaru (niewiele kompresji danych losowych).

Następnie zcat 5G.gz | wc -c zgłosiła ten sam rozmiar co oryginalny plik: 5120000000 bajtów. Tak więc moja sugestia wydawała się działać dla tego procesu.

Dzięki za czekał

+0

Tak dzięki, ale moje pytanie było bardziej w sensie. Jak uzyskać nieskompresowany rozmiar pliku bez faktycznej dekompresji. Dla plików mniejszych niż pliki 32-bitowe. Możesz po prostu wyodrębnić ostatnie 4 bajty. Nie jest to możliwe w przypadku większych plików, a tak jak to się stało, jedynym sposobem jest wykonanie dekompresji. – monkeyking

+0

Jednak moja metoda przeprowadziła dekompresję, która nie miała wpływu na oryginalny skompresowany plik i nie utworzyła dodatkowego nieskompresowanego pliku. Nie będzie później sprzątania. I myślę, że warto zauważyć, że odpowiedź, którą zaakceptowaliście, powiedziała, że ​​dekompresja była jedynym * sposobem uzyskania dokładnego rozmiaru. Ma sens, że * jedynym sposobem, aby dowiedzieć się, co jest w pudełku, jest otwarcie go *. – pavium

+0

Tak, nie wpłynęło to na oryginalny plik, ale moim problemem nie było "nie dotykanie" pliku, a jedynie problem z szybkością. Jeśli chcę przydzielić tablicę dla wszystkich danych, powinienem znać rozmiar. To wymaga przeprowadzenia dekompresji, a następnie kolejnej dekompresji dla rzeczywistej transmisji danych. Nie jest to konieczne, jeśli plik jest mniejszy niż 2,1 GB. std gunzip można również rozpakować do stdout, robi gunzip -c plik | wc -c Ale dzięki za wejścia :) – monkeyking

0

gzip ma -l opcję:

 -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

To rozwiązanie działa tylko dla pliku dysku, a nie strumienia (oryginalne pytanie nie określało strumienia, więc pod tym względem jest to realna odpowiedź). Niestety, dla plików większych niż 2^32-1 bajtów, rozmiar nieskompresowany jest pokazany modulo 2^32, a więc nie jest wiarygodny. – Curt

Powiązane problemy