Как сжать 300GB файл с помощью python

Я пытаюсь сжать файл виртуальной машины размером 300 ГБ.

Каждый раз скрипт python убивается, потому что фактическое использование памяти gzip модуля превышает 30 ГБ (виртуальная память).

Есть ли способ добиться сжатия большого файла (300 ГБ на 64 ТБ) с помощью python?

def gzipFile(fileName):
 startTime = time.time()
 with open(fileName,'rb') as fileHandle:
 compressedFileName = "%s-1.gz" % fileName
 with gzip.open(compressedFileName, 'wb') as compressedFH:
 compressedFH.writelines(fileHandle)

 finalTime = time.time() - startTime
 print("gzipFile=%s fileName=%s" % (finalTime,compressFileName))
2 ответа

with gzip.open(compressedFileName, 'wb') as compressedFH:
 compressedFH.writelines(fileHandle)

записывает файл fileHandle по fileHandle, т.е. разбивает его на куски, разделенные символом \n.

Хотя вполне вероятно, что этот символ иногда возникает в двоичном файле, это не гарантируется.

Лучше было бы сделать

with gzip.open(compressedFileName, 'wb') as compressedFH:
 while True:
 chunk = fileHandle.read(65536)
 if not chunk: break # the while loop
 compressedFH.write(chunk)

или, как пишет tqzf в комментарии,

with gzip.open(compressedFileName, 'wb') as compressedFH:
 shutil.copyfileobj(fileHandle, compressedFileName)


from subprocess import call
call(["tar", "-pczf name_of_your_archive.tar.gz /path/to/directory"])

Запускайте его извне, простейшим способом и, вероятно, самым быстрым.

licensed under cc by-sa 3.0 with attribution.