получить размер сжатого файла при сжатии - PullRequest
0 голосов
/ 09 июля 2020

Я сейчас пытаюсь создать модуль, который записывает файл * .gz до определенного c размера. Я хочу использовать его для пользовательского обработчика журналов, чтобы указать максимальный размер заархивированного файла журнала. Я уже прошел через документацию gzip , а также документацию zlib .

Я мог бы сразу использовать zlib и измерить длину моего сжатого байтового массива, но затем Мне пришлось бы самому создать и написать заголовок файла gzip. В самой zlib-документации написано: For reading and writing .gz files see the gzip module.. Но я не вижу никакой возможности получить размер сжатого файла в модуле gzip.

logfile, открытый через logfile = gzip.open("test.gz", "ab", compresslevel=6), имеет параметр .size, но это размер файла исходный файл, а не сжатый файл.

Также os.path.getsize("test.gz") равно нулю до тех пор, пока logfile не будет закрыт и не будет записан на диск.

Вы хоть представляете, как я могу использовать встроенный модуль gzip для закрытия сжатого файла, когда он достиг определенного размера? Не закрывая и не открывая все время?

Или это вообще возможно? Спасибо за любую помощь в этом!

Обновление : Неверно, что данные не записываются на диск, пока файл не будет закрыт, просто требуется некоторое время, чтобы собрать несколько килобайт перед размером файла изменения. Это хорошо для меня и моего использования, так что это решено. Спасибо за любой ввод!

Мой тестовый код для этого:

import os
import gzip
import time

data = 'Hello world'
limit = 10000
i = 0

logfile = gzip.open("test.gz", "wb", compresslevel=6)
while i < limit:
    msg = f"{data} {str(i)} \n"
    logfile.write(msg.encode("utf-8"))
    print(os.path.getsize("test.gz"))
    print(logfile.size)
    if i > 1000:
        logfile.flush()
        break
    #time.sleep(0.03)
    i += 1
logfile.close()
print(f"final size of *.gz file: {os.path.getsize('test.gz')}")
print(f"final size of logfile object file: {logfile.size}")

1 Ответ

0 голосов
/ 09 июля 2020

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

...