Gzip огромный каталог в отдельные файлы .gz для передачи SSH

321
pir

У меня есть каталог ~ 200.000 .npy файлов с общим размером ~ 100 ГБ. Все файлы хранятся непосредственно под основным каталогом (т.е. нет подкаталогов). Мне нужно перенести каталог, и я хотел бы сделать это, сначала сжав его в меньшее количество файлов gzip, которые я затем передал, используя ssh. Я попытался сразу сжать весь каталог, что заставило мой сервер зависнуть, потребовав полной перезагрузки.

Как я могу легко сжать каталог файлов, скажем, в 1000 .gz файлов, которые затем легко перенести и разархивировать?

Я бы предпочел сделать это таким образом, чтобы максимальное потребление ресурсов на сервере в любой точке (в первую очередь, RAM / IO) не зависело от характеристик каталога (общий размер / количество файлов). Я надеюсь, что мне удастся найти метод, который я смогу использовать с еще большими каталогами, не останавливая мой сервер. Решение должно быть предпочтительно с использованием Bash или Python. Спасибо!

2
Когда вы пытались сжать весь каталог, что именно вы делали? Daniel B 7 лет назад 0

1 ответ на вопрос

2
user4815162342

Похоже, это хорошо подходит для rsync. Он будет прозрачно сжимать содержимое, и ему можно будет ограничить использование полосы пропускания, что служит как для предотвращения засорения сети, так и для предотвращения высокой нагрузки ввода-вывода на исходном сервере:

rsync -az --bwlimit=1m directory server:/destination/ 

-aуказывает rsyncна копирование метаданных файла, таких как время создания, -zозначает использование сжатия и --bwlimitограничивает полосу пропускания, используемую в сети.

В качестве дополнительного бонуса при rsyncиспользовании, если вы по какой-либо причине прервете операцию и снова запустите ее, она автоматически подберет то место, где остановилась. Если вам также необходимо удалить дополнительные файлы в месте назначения, добавьте эту --deleteопцию.

Это хорошее предложение, но что если у вас не установлен rsync на целевом сервере? Alessandro Dotti Contra 7 лет назад 0
@adc `rsync` обычно устанавливается на серверах Linux. Если вы наткнетесь на тот, у которого его нет, я бы предложил объединить `tar czf - directory | ssh remote 'cd destination && tar xf -'`. Если это выполняется слишком быстро и вызывает высокую нагрузку ввода-вывода на исходном сервере, добавьте `throttle -m 1` между первыми` tar` и `ssh`. (Вам нужно установить утилиту `throttle`, но только на клиенте.) user4815162342 7 лет назад 1
Я согласен, что rsync является частью почти всех установок по умолчанию на Linux-сервере, но вы никогда не узнаете наверняка заранее, так как некоторым системным администраторам нравится удалять все, что не является строго необходимым. Просто ради обсуждения, потому что мы отдаляемся от первоначального вопроса. Alessandro Dotti Contra 7 лет назад 0
@adc Достаточно верно. Не имея в своем распоряжении rsync, я бы выбрал решение на основе tar. Если хотите, я могу опубликовать это как отдельный ответ. user4815162342 7 лет назад 0
Вы можете редактировать и расширять свой ответ, если хотите; Я придерживаюсь обоих ваших решений. Alessandro Dotti Contra 7 лет назад 0
Выглядит хорошо! Имеет смысл использовать этот подход вместо gzipping. Тем не менее, я попытался запустить это, и пока он просто остановился на консоли. Знаете ли вы, какое разумное время для его инициализации и запуска синхронизации? pir 7 лет назад 0
@pir 200k довольно много файлов; если не уверены, добавьте `-v`, чтобы увидеть, что делает rsync. user4815162342 7 лет назад 1