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

Другие вопросы по тегам