
Eu tenho uma lista de arquivos que preciso copiar em um sistema Linux - cada arquivo varia de 10 a 100 GB.
Eu só quero copiar para o sistema de arquivos local. Existe uma maneira de fazer isso em paralelo - com vários processos, cada um responsável por copiar um arquivo - em umsimplesmaneiras?
Posso escrever facilmente um programa multithread para fazer isso, mas estou interessado em descobrir se existe um método Linux de baixo nível para fazer isso.
Responder1
Se o seu sistema não for prejudicado por ele (por exemplo, talvez os arquivos estejam em cache), então GNU Parallelhttp://www.gnu.org/software/parallel/pode funcionar para você:
find . -type f -print0 | parallel -0 -j10 cp {} destdir
Isso executará 10 cp
s simultâneos.
Pró: É simples de ler.
Contra: GNU Parallel não é padrão na maioria dos sistemas - então você provavelmente terá que instalá-lo.
Se você quiser manter a estrutura de diretórios:
find . -type f -print0 |
parallel -0 -j10 mkdir -p destdir/{//}';' cp {} destdir/{//}
Assista ao vídeo de introdução para mais informações:http://www.youtube.com/watch?v=OpaiGYxkSuQ
Veja tambémhttps://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/para uma discussão sobre E/S de disco paralelo.
Responder2
Não existe um mecanismo de baixo nível para isso por uma razão muito simples: fazer isso destruirá o desempenho do seu sistema. Com unidades de prato, cada gravação competirá pelo posicionamento do cabeçote, levando a uma enorme espera de E/S. Com SSDs, isso acabará saturando um ou mais barramentos do sistema, causando outros problemas.
Responder3
Como mencionado, esta é uma ideia terrível. Mas acredito que todos deveriam ser capazes de implementar seus próprios planos horríveis, então...
for FILE in *;do cp $FILE <destination> &;done
O asterisco pode ser substituído por uma expressão regular dos seus arquivos ou $(cat <listfile>)
se você tiver todos eles em um documento de texto. O E comercial inicia um comando em segundo plano, então o loop continuará, gerando mais cópias.
Conforme mencionado, isso aniquilará completamente o seu IO. Então... eu realmente não recomendaria fazer isso.
--Christopher Karel
Responder4
Aqui está uma ferramenta de cópia de arquivo distribuída/paralela e descentralizada que irá dividir o arquivo e copiar todos os pedaços em paralelo. Provavelmente só o ajudará se você tiver um SSD que suporte vários fluxos ou algum tipo de configuração com vários cabeçotes de disco.