Параллельное копирование файлов

Параллельное копирование файлов

У меня есть список файлов, которые мне нужно скопировать в систему Linux. Размер каждого файла составляет от 10 до 100 ГБ.

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

Я могу легко написать многопоточную программу для этого, но мне интересно узнать, существует ли низкоуровневый метод Linux для этого.

решение1

Если ваша система не перегружена этим (например, файлы находятся в кэше), то GNU Parallelhttp://www.gnu.org/software/parallel/может подойти вам:

find . -type f -print0 | parallel -0 -j10 cp {} destdir

Это позволит запустить 10 одновременных cpпроцессов.

Плюсы: Легко читается.

Минусы: GNU Parallel не входит в стандартную комплектацию большинства систем, поэтому вам, вероятно, придется его установить.

Если вы хотите сохранить структуру каталогов:

find . -type f -print0 |
  parallel -0 -j10 mkdir -p destdir/{//}';' cp {} destdir/{//}

Для получения более подробной информации посмотрите вступительное видео:http://www.youtube.com/watch?v=OpaiGYxkSuQ

Смотрите такжеhttps://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/для обсуждения параллельного дискового ввода-вывода.

решение2

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

решение3

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

for FILE in *;do cp $FILE <destination> &;done

Звездочку можно заменить регулярным выражением ваших файлов или, $(cat <listfile>)если они все находятся в текстовом документе. Амперсанд запускает команду в фоновом режиме, поэтому цикл будет продолжаться, порождая больше копий.

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

--Кристофер Карел

решение4

Вот распределенный/параллельный и децентрализованный инструмент копирования файлов, который разделит файл на части и скопирует все части параллельно. Он, вероятно, поможет вам только если у вас есть SSD, поддерживающий несколько потоков или какая-то настройка с несколькими головками дисков.

https://github.com/hpc/dcp

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