Python: как создать tar-файл и сжать его на лету с помощью внешнего модуля, используя различные методы сжатия, недоступные в модуле tar file?
Я пытаюсь настроить код для упаковки нескольких больших файлов (от десятков до сотен гигабайт) в один архив. Методы сжатия, которые поддерживаются в модуле tarfile, немного медленны для такого большого объема данных, поэтому я хотел бы использовать некоторый внешний модуль сжатия, например lz4, для достижения лучшей скорости сжатия. К сожалению, я не могу найти способ, как создать tar-файл и сжать его с помощью lz4 на лету, чтобы избежать создания временного tar-файла. Документация модуля tarfile гласит, что есть способ открыть несжатый поток для записи, используя 'w|' Режим. Это способ потоковой передачи файла tar непосредственно в модуль lz4? Если да, то как правильно его использовать? Большое спасибо.
2 ответа
За наш разговор выше.
import tarfile
import subprocess
p = subprocess.Popen(['lz4', '-'], stdin=subprocess.PIPE)
tar = tarfile.open(fileobj=p.stdin, mode="w|")
Оттуда вы можете сделать обычное tar.addfile
, К вашему сведению: как я уже говорил в разговоре. GNU tar может автоматически определять gz и bz2, но не lz4. Просто записка. Так что вы должны сделать lz4 -c -d stdin.lz4 | tar xf -
извлечь файлы. Если вы просто сделали tar xf
это потерпит неудачу.
Вы можете передать результат tar
Команда непосредственно к lz4
полезность. Это позволит избежать использования любого промежуточного файла. Вот пример (при условии, что у вас есть оба tar
а также lz4
установлен в вашей системе):
tar cvf - * | lz4 > mypack.tar.lz4
-
здесь говорит выводить результат из tar
в stdout
, Конечно, вы можете изменить *
с какой целью вы хотите смолить.
Обратная операция также возможна:
lz4 -d mypack.tar.lz4 | tar xv