Инструмент сжатия, адаптивный ко времени

Инструмент сжатия, адаптивный ко времени

Я спрашиваю о сценарии копирования большого файла на удаленный сервер.

Самый простой случай:

tar c myfile | ssh myserver tar x

Если сетевое соединение быстрое, то все в порядке.

На более медленной сети я делаю

tar c myfile | bzip2 -1 | ssh myserver tar xj

-- ускоряя передачу данных за счет процессорного времени.

Конечно, я могу поиграться со степенью сжатия, обычно пытаясь угадать правильную, чтобы мой процессор не был слишком загружен, а сеть не перегружалась.

Существует ли утилита сжатия или флаг сжатия, который бы указал bzip2/ xz/... сжимать данные как можно сильнее, пока выходной буфер занят?

решение1

zstd --adapt

Thezstdутилита сжатияимеет опцию, которая включает адаптивное сжатие (опция была добавлена ​​в zstdv1.3.6). Это настроит сжатие на «текущее воспринимаемое состояние ввода-вывода».

zstdБолее подробную информацию смотрите в руководстве.

Полный конвейер может выглядеть примерно так:

tar -c -f - source_directory |
zstd --adapt |
ssh user@server 'cd /someplace && { zstd -d | tar -x -f -;}'

или

tar -c -f - source_directory |
zstd --adapt |
ssh user@server 'zstd -d | tar -x -C /someplace -f -'

Если вы добавите -vпервый элемент zstdв конвейере, вы увидите строку индикатора прогресса, которая будет содержать что-то вроде

(L7) Buffered :  32 MB - Consumed : 192 MB - Compressed :  72 MB => 37.50%

где (L7)указывает на уровень сжатия. Для любого умеренно большого объема данных можно было бы ожидать, что он будет колебаться со временем, показывая, что zstdон действительно адаптируется к условиям ввода-вывода (и, предположительно, также к самим данным).

Связанный контент