Qual é a melhor maneira de executar uma cópia paralela no Unix?

13

Eu rotineiramente tenho que copiar o conteúdo de uma pasta em um sistema de arquivos de rede para o meu computador local. Existem muitos arquivos (1000s) na pasta remota que são relativamente pequenos, mas devido à sobrecarga da rede, uma cópia normal cp remote_folder/* ~/local_folder/ leva muito tempo (10 minutos).

Eu acredito que é porque os arquivos estão sendo copiados seqüencialmente - cada arquivo espera até que o anterior termine antes que a cópia comece.

Qual é a maneira mais simples de aumentar a velocidade dessa cópia? (Eu suponho que é para executar a cópia em paralelo.)

Fechar os arquivos antes de copiar não irá necessariamente acelerar as coisas, porque eles podem ser salvos em discos diferentes em servidores diferentes.

    
por dsg 24.08.2011 / 22:50

6 respostas

6

Contanto que você limite os comandos de cópia em execução, você provavelmente poderá usar um script como o publicado por Examinador

SOURCEDIR="$1"
TARGETDIR="$2"
MAX_PARALLEL=4
nroffiles=$(ls "$SOURCEDIR" | wc -w)
setsize=$(( nroffiles/MAX_PARALLEL + 1 ))
ls -1 "$SOURCEDIR"/* | xargs -n "$setsize" | while read workset; do
  cp -p "$workset" "$TARGETDIR" &
done
wait
    
por 24.08.2011 / 23:32
7

Se você tem o link do GNU Paralelo instalado, você pode fazer isso:

parallel -j10 cp {} destdir/ ::: *

Você pode instalar o GNU Parallel simplesmente por:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

Assista aos vídeos de introdução do GNU Parallel para saber mais: link

    
por 15.01.2013 / 18:17
3

Uma maneira seria usar rsync , que copiará apenas as alterações - novos arquivos e partes alteradas de outros arquivos.

link

A execução de qualquer forma de operação de cópia paralela provavelmente inundará sua rede e a operação de cópia será interrompida ou sofrerá de afunilamentos no disco de origem ou de destino.

    
por 24.08.2011 / 22:52
1

Honestamente, a melhor ferramenta é a gsutil do Google. Ele lida com cópias paralelas com recursão de diretório. A maioria dos outros métodos que vi não pode manipular a recursão de diretório. Eles não mencionam especificamente o sistema de arquivos local para cópias locais do sistema de arquivos em seus documentos, mas funciona como um encanto.

É outro binário para instalar, mas provavelmente um que você já possa executar considerando toda a adoção de serviços em nuvem hoje em dia.

    
por 30.05.2016 / 22:23
0

Há muitas coisas que você pode ter que considerar, dependendo da topologia que você tem. Mas antes de começar a pensar em soluções complexas, você pode simplesmente tentar dividir a tarefa em dois trabalhos e verificar se o tempo necessário reduzirá significativamente:

Da próxima vez que tentar:

  cp remote_folder/[a-l]* ~/local_folder/ &
  cp remote_folder/[!a-l]* ~/local_folder/ &
  wait
  wait

(você pode querer substituir [a-l] * para outra coisa que corresponda a metade dos arquivos - talvez [0-4] * - dependendo do conteúdo da pasta)

Se o tempo não melhorar drasticamente, pode ser mais importante verificar se é necessário copiar todos os arquivos (qual a proporção de arquivos alterados para todos os arquivos?)

    
por 15.09.2011 / 16:54
0

Rsync paralelo usando find:

export SOURCE_DIR=/a/path/to/nowhere
export DEST_DIR=/another/path/to/nowhere

# sync folder structure first
rsync -a -f'+ */' -f'- *' $SOURCE_DIR $DEST_DIR

# cwd
cd $SOURCE_DIR

# use find to help filter files etc. into list and pipe into gnu parallel to run 4 rsync jobs simultaneously
find . -type f | SHELL=/bin/sh parallel --linebuffer --jobs=4 'rsync -av {} $DEST_DIR/{//}/'

em uma LAN corporativa, o rsync único tem cerca de 800Mbps; com 6-8 postos de trabalho eu sou capaz de superar 2.5Gbps (à custa de alta carga). Limitado pelos discos.

    
por 09.12.2017 / 06:34