
У меня есть список файлов, которые мне нужно скопировать в систему 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, поддерживающий несколько потоков или какая-то настройка с несколькими головками дисков.