web-dev-qa-db-ja.com

Unixで並列コピーを実行する最良の方法は何ですか?

日常的に、ネットワークファイルシステムのフォルダーの内容をローカルコンピューターにコピーする必要があります。リモートフォルダーには多くのファイル(1000個)があり、それらはすべて比較的小さいですが、ネットワークのオーバーヘッドのために通常のコピーcp remote_folder/* ~/local_folder/には非常に長い時間がかかります(10分)。

これは、ファイルが順次コピーされているためだと思います。各ファイルは、前のファイルが完了するまで待機してから、コピーを開始します。

このコピーの速度を上げる最も簡単な方法は何ですか? (コピーを並行して実行することを想定しています。)

コピーする前にファイルを圧縮しても、すべてが異なるサーバーの異なるディスクに保存される可能性があるため、必ずしも速度が向上するわけではありません。

19
dsg

実行しているコピーコマンドを制限する限り、おそらく Scrutinizer によって投稿されたスクリプトを使用できます。

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
8
OldWolf

GNU Parallel http://www.gnu.org/software/parallel/ がインストールされている場合、これを行うことができます:

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

あなたは単にGNU Parallelをインストールすることができます:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh

GNU Parallelの紹介ビデオをご覧ください:詳細は https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

10
Ole Tange

1つの方法は、rsyncを使用して変更のみをコピーすることです-新しいファイルと他のファイルの変更された部分。

http://linux.die.net/man/1/rsync

何らかの形で並列コピー操作を実行すると、おそらくネットワークが溢れ、コピー操作が停止して停止するか、ソースまたは宛先ディスクでボトルネックが発生します。

3
Linker3000

Findを使用した並列rsync:

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/{//}/'

企業LANでは、単一のrsyncは約800Mbpsを行います。 6〜8個のジョブを使用すると、2.5 Gbpsを超えることができます(高負荷を犠牲にして)。ディスクによって制限されます。

2
yee379

正直なところ、最良のツールはGoogleのgsutilです。ディレクトリの再帰で並列コピーを処理します。私が見た他のほとんどのメソッドは、ディレクトリの再帰を処理できません。彼らはドキュメントでローカルファイルシステムからローカルファイルシステムへのコピーについて具体的に言及していませんが、それは魅力のように機能します。

これはインストールするもう1つのバイナリですが、おそらく今日のクラウドサービスのすべての採用を考慮して、すでに実行している可能性があります。

2
diq

トポロジーによっては、考慮しなければならないことがたくさんあります。ただし、複雑なソリューションについて考える前に、タスクを2つのジョブに分割して、必要な時間が大幅に短縮されるかどうかを確認するだけです。

次回は試してください:

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

([a-l] *をファイルの約半分に一致する別のものに置き換えることができます-おそらく[0-4] *-フォルダーの内容によって異なります)

時間が大幅に改善されない場合は、すべてのファイルをコピーする必要があるかどうかを確認することがより重要になる場合があります(すべてのファイルに対する変更されたファイルの比率はどのくらいですか?)

1
ktf