J'ai une liste de fichiers que je dois copier sur un système Linux - chaque fichier varie de 10 à 100 Go.
Je veux seulement copier sur le système de fichiers local. Existe-t-il un moyen de le faire en parallèle - avec plusieurs processus chargés chacun de copier un fichier - de manière simple ?
Je peux facilement écrire un programme multithread pour ce faire, mais je suis intéressé à savoir s'il existe une méthode Linux de bas niveau pour le faire.
Réponses:
Si votre système n'est pas détruit par lui (par exemple, peut-être que les fichiers sont dans le cache), GNU Parallel http://www.gnu.org/software/parallel/ peut fonctionner pour vous:
Cela exécutera 10
cp
s simultanés .Pro: C'est simple à lire.
Con: GNU Parallel n'est pas standard sur la plupart des systèmes - vous devez donc probablement l'installer.
Regardez la vidéo d'introduction pour plus d'informations: http://www.youtube.com/watch?v=OpaiGYxkSuQ
Voir aussi https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/ pour une discussion sur les E / S disque parallèles.
la source
Il n'y a pas de mécanisme de bas niveau pour cela pour une raison très simple: cela détruira les performances de votre système. Avec les lecteurs de plateau, chaque écriture se disputera le placement de la tête, ce qui entraînera une attente d'E / S massive. Avec les SSD, cela finira par saturer un ou plusieurs de vos bus système, provoquant d'autres problèmes.
la source
Comme mentionné, c'est une idée terrible. Mais je crois que tout le monde devrait pouvoir mettre en œuvre ses propres plans horribles, sooo ...
for FILE in *;do cp $FILE <destination> &;done
L'astérisque peut être remplacé par une expression régulière de vos fichiers, ou
$(cat <listfile>)
si vous les avez tous dans un document texte. L'esperluette lance une commande en arrière-plan, de sorte que la boucle continuera, générant plus de copies.Comme mentionné, cela annihilera complètement votre E / S. Alors ... je ne recommanderais vraiment pas de le faire.
--Christopher Karel
la source
La seule réponse qui ne gâchera pas la réactivité de votre machine n'est pas exactement une «copie», mais elle est très rapide. Si vous ne modifiez pas les fichiers dans le nouvel ou l'ancien emplacement, alors un lien dur est effectivement comme une copie, et (seulement) si vous êtes sur le même système de fichiers, ils sont créés très très très rapidement.
Vérifiez
cp -l
et voyez si cela fonctionnera pour vous.la source
Voici un outil de copie de fichiers distribué / parallèle et décentralisé qui fragmentera le fichier et copiera tous les morceaux en parallèle. Cela ne vous aidera probablement que si vous avez un SSD qui prend en charge plusieurs flux ou une sorte de configuration avec plusieurs têtes de disque.
https://github.com/hpc/dcp
la source
Pour les gens qui pensent que ce n'est pas une bonne idée, je dirais que cela dépend. Vous pouvez avoir un gros système de raid ou un système de fichiers parallèle qui offrira des performances vraiment meilleures qu'un processus cp peut gérer. Alors oui, vous devez utiliser un "outil parallèle".
Prenons cet exemple:
ensuite ceci
donc chaque écriture syscall effectuée par "cp" dans ce cas est de 64 Ko et pendant 10 secondes sur mon système, je suis en mesure de fournir cette bande passante: 65536 * 166222/10 = 1089352499 = ~ 1,08 Go / s
Maintenant, lançons cette charge de travail avec 2 processus (j'ai 4 cœurs mais mon bureau est utilisé pour d'autres choses, et ici ce n'est qu'un exemple):
Nous voyons donc que nous pouvons presque doubler les performances en utilisant 2 cœurs pour lancer cela.
Donc, si nous sommes dans un contexte différent du lecteur 1xHard au lecteur 1xHard mais d'un tableau RAID (ou de plusieurs NVMe, donc pas le cas le plus courant, je suis d'accord mais je travaille dessus tous les jours), cela montre certainement une meilleure performance pour utiliser plusieurs communs dans parallèle.
la source
Vous devriez essayer ceci:
Cela copiera le fichier passwd 3 fois depuis le répertoire / etc / vers votre $ HOME
Ou si votre fichier est dans votre répertoire personnel
Cela copiera le fichier passwd 3 fois dans votre $ HOME
la source