GZipping файлы с python - PullRequest
       6

GZipping файлы с python

0 голосов
/ 02 февраля 2020

Это нормально, что алгоритм gzip может сделать размер файла большим после сжатия? Например, необходимо разбить большой файл размером 8,2 Мбайт на небольшие фрагменты размером 101024 по 81 байт и сжать их с помощью библиотеки gzip. После того, как это сделано, я вижу, что папка с gzip-файлами стала больше по размеру и теперь она составляет 13 МБ по сравнению с общим размером чанков без сжатия. Например, здесь есть фрагмент кода:

def gzip_it(filenumber, chunk, path=FOLDER_PATH, prefix=FILE_NAME_PREFIX):
    with gzip.open(os.path.join(path, prefix + "{:07d}".format(filenumber) + ".gz"), mode="wb") as chunk_file:
        chunk_file.write(gzip.compress(chunk))

def split_and_write(file, thread_num):
    spare_to_distribute_inner = SPARE_TO_DISTRIBUTE
    initial_position = 0 if thread_num == 0 else BYTES_PER_THREAD * thread_num
    initial_file_num = 0 if thread_num == 0 else FILES_PER_THREAD * thread_num
    with open(file, mode="rb") as file:
         file.seek(initial_position)
         while initial_file_num < FILES_PER_THREAD * (thread_num + 1):
            if spare_to_distribute_inner:
                chunk = file.read(CHUNK_FILE_SIZE + 1)
                gzip_it(initial_file_num, chunk)
                initial_file_num += 1
                initial_position += (CHUNK_FILE_SIZE + 1)
                spare_to_distribute_inner -= 1
            else:
                if initial_file_num == FILES_TOTAL - 1:
                    chunk = file.read(CHUNK_FILE_SIZE + SPARE_TO_DISTRIBUTE_REMAINDER)
                    gzip_it(initial_file_num, chunk)
                    make_marker_file(str(SOURCE_FILE_SIZE).encode())
                    break
                else:
                    chunk = file.read(CHUNK_FILE_SIZE)
                    gzip_it(initial_file_num, chunk)
                    initial_file_num += 1
                    initial_position += CHUNK_FILE_SIZE


def main():
    for thread in range(VIRTUAL_THREADS):
        pool.submit(split_and_write, "cry_cmake.exe", thread)

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Да, вполне нормально, что файлы увеличиваются после сжатия. Обычно это происходит с файлами, которые уже сжаты.

То, что вы делаете, неправильно. Ваши куски слишком малы, чтобы их можно было сжать осмысленно. Попробуйте создать куски размером 1 МБ или более.

В основном при сжатии алгоритм ищет повторяющиеся последовательности и сокращает их, создавая первоначальный словарь с исходной последовательностью и сокращенной версией.

Если чанки настолько малы, что на самом деле они не могут найти длинные повторяющиеся последовательности и должны повторять этот начальный словарь для каждого чанка.

0 голосов
/ 06 марта 2020

Почему вы хотите сначала разбить исходный файл и сжать каждый мини-блок отдельно? В большинстве случаев люди сначала сжимают, а потом разбивают.

Альтернативой для вашего случая может быть разбиение исходного файла на мини-фрагменты, но не сжимать каждый из них по отдельности, а вместо этого помещать их все в один каталог и затем создайте .tgz из каталога:

tar -c -z -f result.tgz chunks_directory/

Затем происходит сжатие после того, как tar снова объединит все файлы, но после распаковки вы получите все Снова файлы мини-куска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...