Я спрашиваю о сценарии копирования большого файла на удаленный сервер.
Самый простой случай:
tar c myfile | ssh myserver tar x
Если сетевое соединение быстрое, то все в порядке.
На более медленной сети я делаю
tar c myfile | bzip2 -1 | ssh myserver tar xj
-- ускоряя передачу данных за счет процессорного времени.
Конечно, я могу поиграться со степенью сжатия, обычно пытаясь угадать правильную, чтобы мой процессор не был слишком загружен, а сеть не перегружалась.
Существует ли утилита сжатия или флаг сжатия, который бы указал bzip2
/ xz
/... сжимать данные как можно сильнее, пока выходной буфер занят?
решение1
zstd --adapt
Thezstd
утилита сжатияимеет опцию, которая включает адаптивное сжатие (опция была добавлена в zstd
v1.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
он действительно адаптируется к условиям ввода-вывода (и, предположительно, также к самим данным).