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


17

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

これは、ファイルが順番にコピーされるためだと考えています。各ファイルは、コピーが開始される前に前のファイルが完了するまで待機します。

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

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


コピーする前にファイルを圧縮すると、「そのファイルを手に入れた」、「はい、私はしました」、「次のファイルがあります」、「大丈夫」などの必要がなくなるため、処理速度が大幅に向上します。あなたを遅くする「ターンアラウンド」。
デビッドシュワルツ

ネットワーク速度ではなくディスク速度が制限要因である可能性があります。その場合、ファイルごとにこれを並行して実行すると、ディスクが常に前後にシークされるように強制されるため、操作が遅くなりますが、速くなりませんファイル間。
ジョエルCoehoorn

zip圧縮は良いアイデアではないかもしれませんが(数千のファイルで圧縮アルゴリズムを実行するには少し時間がかかるかもしれません)、tarは実行可能かもしれません。
ロブ

@JoelCoehoornそれでも、そうでない場合があります。たとえば、複数のスピンドル+小さなファイル(または単にランダムな読み取り)。このシナリオでは、「パラレルcp」が役立ちます。
CAFxX

回答:


8

実行しているコピーコマンドを制限する限り、おそらく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

1
ただし、警告の注意:このスクリプトは、スペースまたはグロビング文字を含むファイル名で壊れます。
-slhck

@OldWolf-このスクリプトの仕組みを説明できますか?たとえば、並列化を行うのはどの部分ですか?
dsg

3
@dsg:コマンド&の最後で、ループを続行し、待機せずに次のcpコマンドを開始cpできますwhile。このxargsコマンドは、4つのグループ(MAX_PARALLEL)のファイル名をwhileループに渡します。
RedGrittyBrick

私にはうまくいきませんでした。スピードアップできるかどうかはわかりませんcp。明らかに、マルチスレッド化により計算を高速化できます。しかし、ハードドライブのデータ処理にも同じことが当てはまるとは思いません。
Adobe

8

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

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

GNU Parallelは次の方法で簡単にインストールできます。

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

詳細については、GNU Parallelのイントロビデオをご覧くださいhttps : //www.youtube.com/playlist?list=PL284C9FF2488BC6D1


3

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

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

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


2

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

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


2

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.5Gbpsを超えることができます(高負荷を犠牲にして)。ディスクによって制限されます。


0

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

次回の試行:

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

([al] *をファイルの約半分に一致する別のものに置き換えたい場合があります-フォルダーの内容に応じて[0-4] *になります)

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.