
Linux システムにコピーする必要があるファイルのリストがあります。各ファイルのサイズは 10 ~ 100 GB の範囲です。
ローカルファイルシステムにコピーしたいだけです。これを並列に行う方法はありますか? - 複数のプロセスがそれぞれファイルのコピーを担当します -単純やり方?
これを実行するためのマルチスレッド プログラムを簡単に作成できますが、これを実行するための低レベルの Linux メソッドがあるかどうかを知りたいです。
答え1
システムがこれによってスラッシングされない場合(例えば、ファイルがキャッシュ内にある場合)、GNU Parallelhttp://www.gnu.org/software/parallel/あなたに役立つかもしれません:
find . -type f -print0 | parallel -0 -j10 cp {} destdir
これにより、10 個の同時実行が実行されますcp
。
利点: 読みやすい。
欠点: GNU Parallel はほとんどのシステムでは標準ではないため、インストールする必要がある可能性があります。
ディレクトリ構造を維持したい場合:
find . -type f -print0 |
parallel -0 -j10 mkdir -p destdir/{//}';' cp {} destdir/{//}
詳細については紹介ビデオをご覧ください:http://www.youtube.com/watch?v=OpaiGYxkSuQ
参照https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/並列ディスク I/O の説明については、こちらをご覧ください。
答え2
非常に単純な理由から、これに対する低レベルのメカニズムはありません。これを行うと、システムのパフォーマンスが損なわれるからです。プラッタ ドライブでは、各書き込みがヘッドの配置を争うため、大量の I/O 待機が発生します。SSD では、これにより 1 つ以上のシステム バスが飽和状態になり、他の問題が発生します。
答え3
前述したように、これはひどいアイデアです。しかし、誰もが自分自身のひどい計画を実行できるべきだと私は信じています。
for FILE in *;do cp $FILE <destination> &;done
アスタリスクは、ファイルの正規表現に置き換えることができます$(cat <listfile>)
。または、すべてのファイルがテキスト ドキュメントに含まれている場合は、その正規表現に置き換えることができます。アンパサンドはバックグラウンドでコマンドを開始するため、ループが継続され、さらにコピーが生成されます。
前述したように、これにより IO が完全に破壊されます。したがって、これを実行することはお勧めしません。
--クリストファー・カレル
答え4
これは、ファイルをチャンクに分割し、すべてのチャンクを並列にコピーする、分散/並列の非中央集権型ファイル コピー ツールです。複数のストリームをサポートする SSD または複数のディスク ヘッドを備えた何らかのセットアップがある場合にのみ役立つ可能性があります。