11 votes

Copie de fichiers en parallèle

J'ai une liste de fichiers que je dois copier sur un système Linux - chaque fichier a une taille comprise entre 10 et 100 Go.

Je ne veux copier que sur le système de fichiers local. Existe-t-il un moyen de faire cela en parallèle - avec plusieurs processus chacun responsable de la copie d'un fichier - dans un système de gestion de fichiers ? simple manière ?

Je peux facilement écrire un programme multithread pour faire cela, mais j'aimerais savoir s'il existe une méthode Linux de bas niveau pour faire cela.

17voto

Sakkle Points 998

Si votre système n'est pas mis à mal par ce programme (par exemple, si les fichiers sont en cache), alors GNU Parallel http://www.gnu.org/software/parallel/ peut vous convenir :

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

Ce programme sera exécuté 10 fois simultanément. cp s.

Pro : il est simple à lire.

Inconvénient : GNU Parallel n'est pas standard sur la plupart des systèmes - vous devrez donc probablement l'installer.

Si vous souhaitez conserver la structure du répertoire :

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

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 parallèles sur disque.

4voto

David Points 344

Il n'y a pas de mécanisme de bas niveau pour cela, et ce pour une raison très simple : cela détruira les performances de votre système. Avec les disques à plateaux, chaque écriture se disputera le placement de la tête, ce qui entraînera une attente massive des entrées/sorties. Avec les disques SSD, cela finira par saturer un ou plusieurs des bus de votre système, ce qui entraînera d'autres problèmes.

4voto

isherwood Points 107

Comme nous l'avons dit, c'est une très mauvaise idée. Mais je pense que tout le monde devrait pouvoir mettre en œuvre ses propres plans horribles, alors...

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 se poursuit, produisant d'autres copies.

Comme nous l'avons mentionné, cela annihilera complètement votre OI. Je vous déconseille donc de le faire.

--Christopher Karel

4voto

Slartibartfast Points 3255

La seule réponse qui ne mettra pas à mal 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, un lien en dur est en fait comme une copie, et (seulement) si vous êtes sur le même système de fichiers, ils sont créés très très rapidement.

チェックアウト cp -l et voyez si cela vous convient.

3voto

Jon Bringhurst Points 251

Voici un outil de copie de fichiers distribué/parallèle et décentralisé qui découpe le fichier en morceaux et copie tous les morceaux en parallèle. Il ne vous sera probablement utile que si vous disposez d'un disque SSD prenant en charge plusieurs flux ou d'une sorte de configuration avec plusieurs têtes de disque.

https://github.com/hpc/dcp

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X