Как получить несжатый размер файла> 4GB .gz в python - PullRequest
0 голосов
/ 23 января 2019

Так что эта супер интересная тема уже о получении исходного размера файла .gz. Получается, что размер, который можно получить из 4 байтов конца файла, «просто», чтобы убедиться, что извлечение прошло успешно. Однако: на это можно положиться, если размер извлеченных данных меньше 2 ** 32 байт. то есть. 4 ГБ.

Теперь, ЕСЛИ существует более 4 ГБ несжатых данных, в .gz должно быть несколько элементов! Последние 4 байта только указывают на несжатый размер последнего фрагмента!

Итак, как нам получить конечные байты других кусков ? Чтение спецификаций gzip Я не вижу длины

+=======================+
|...compressed blocks...|
+=======================+

Ok. Должно зависеть от CM - метода сжатия. Что, вероятно, deflate. Давайте посмотрим RFC об этом . Там на странице 11 написано, что есть атрибут LEN для "несжатых блоков", но становится странно, когда они говорят о сжатых блоках ...

Я могу представить что-то вроде

full_size = os.path.getsize(gz_path)
gz = gzip.open(gz_path)
pos = 0
size = 0
while True:
    try:
        head_len = get_header_length(gz, pos)
        block_len = get_block_length(gz, pos + head_len)
        size += get_orig_size(gz, pos + head_len + block_len)
        pos += head_len + block_len + 8
    except:
        break
print('uncompressed size of "%s" is: %i bytes' % (gz_path, full_size)

а как же get_block_length?!? : |

Это, вероятно, никогда не предполагалось, потому что ... "потоковые данные". Но я не хочу сдаваться сейчас. Уже один большой облом: Даже 7zip показывает такой большой .gz с точным несжатым размером только самых последних 4 байтов.

У кого-то есть другая идея?

1 Ответ

0 голосов
/ 25 января 2019

Во-первых, нет, не обязательно быть несколькими членами. Нет ограничений на длину члена gzip. Если размер несжатых данных превышает 4 ГБ, то последние четыре байта просто представляют эту длину по модулю 2 32 . GZIP-файл, содержащий более 4 ГБ несжатых данных, на самом деле, скорее всего, будет одним членом.

Во-вторых, тот факт, что вы можете иметь несколько членов, верен даже для небольших файлов gzip. Несжатые данные не должны быть больше 4 ГБ, чтобы последние четыре байта файла были бесполезны.

Единственный способ надежно определить объем несжатых данных в файле gzip - это распаковать их. Вам не нужно записывать данные, но вы должны обработать весь файл gzip и посчитать количество несжатых байтов.

...