У меня есть список файлов, которые мне нужно скопировать в системе Linux - каждый файл имеет размер от 10 до 100 ГБ.
Я только хочу скопировать в локальную файловую систему. Есть ли способ сделать это параллельно - с несколькими процессами, каждый из которых отвечает за копирование файла - простым способом?
Я могу легко написать многопоточную программу для этого, но мне интересно узнать, существует ли для этого низкоуровневый метод Linux.
Ответы:
Если ваша система не перегружена им (например, возможно, файлы находятся в кеше), тогда GNU Parallel http://www.gnu.org/software/parallel/ может работать для вас:
Это будет работать 10 одновременных
cp
секунд.Pro: это просто читать.
Против: GNU Parallel не является стандартным на большинстве систем - поэтому вам, вероятно, придется установить его.
Посмотрите вступительное видео для получения дополнительной информации: http://www.youtube.com/watch?v=OpaiGYxkSuQ
См. Также https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/ для обсуждения параллельного дискового ввода-вывода.
источник
Для этого нет механизма низкого уровня по очень простой причине: это приведет к снижению производительности вашей системы. При использовании дисков с дисками каждая запись будет бороться за размещение головки, что приводит к массовому ожиданию ввода-вывода. При использовании твердотельных накопителей это приведет к насыщению одной или нескольких системных шин, что вызовет другие проблемы.
источник
Как уже упоминалось, это ужасная идея. Но я считаю, что каждый должен иметь возможность реализовать свои собственные ужасные планы, ооочень ...
for FILE in *;do cp $FILE <destination> &;done
Звездочку можно заменить регулярным выражением ваших файлов или,
$(cat <listfile>)
если они есть в текстовом документе. Амперсанд запускает команду в фоновом режиме, поэтому цикл будет продолжаться, порождая больше копий.Как уже упоминалось, это полностью уничтожит ваш ввод-вывод. Так что ... я бы не советовал это делать.
- Кристофер Карел
источник
Единственный ответ, который не повлияет на скорость отклика вашей машины, - это не просто «копия», а очень быстрый. Если вы не будете редактировать файлы в новом или старом месте, то жесткая ссылка по сути похожа на копию, и (только), если вы находитесь в одной файловой системе, они создаются очень и очень быстро.
Проверьте
cp -l
и посмотрите, будет ли это работать на вас.источник
Вот инструмент распределенного / параллельного и децентрализованного копирования файлов, который разбивает файл на части и копирует все куски параллельно. Вероятно, это поможет вам, только если у вас есть SSD, который поддерживает несколько потоков, или какая-то установка с несколькими головками дисков.
https://github.com/hpc/dcp
источник
Для людей, которые думают, что это не очень хорошая идея, я бы сказал, что это зависит. У вас может быть большая рейдовая система или параллельная файловая система, которая обеспечит действительно лучшую производительность, чем один процесс cp. Тогда да, вам нужно использовать «параллельный инструмент».
Давайте возьмем этот пример:
тогда это
поэтому каждая запись системного вызова, созданная "cp", в этом случае составляет 64 КБ, и в течение 10 секунд в моей системе я могу предоставить эту пропускную способность: 65536 * 166222/10 = 1089352499 = ~ 1,08 ГБ / с.
Теперь давайте запустим эту рабочую нагрузку с 2 процессами (у меня 4 ядра, но мой рабочий стол используется для других вещей, и здесь это только пример):
Итак, мы видим, что мы можем почти удвоить производительность, используя 2 ядра для запуска этого.
Так что если мы находимся в контексте, отличном от диска 1xHard от диска 1xHard, но с массивом raid (или несколькими NVMe, так что я не согласен с этим, но я работаю над этим каждый день), это определенно показывает лучшую производительность при использовании нескольких общих в параллельно.
источник
Вы должны попробовать это:
Это скопирует файл passwd 3 раза из каталога / etc / в ваш $ HOME
Или, если ваш файл находится в вашем домашнем каталоге
Это скопирует файл passwd 3 раза в ваш $ HOME
источник