web-dev-qa-db-ja.com

cpよりも高速にコピーしていますか?

現在、cp -rを使用して、同じディスクに多数のディレクトリとファイルを再帰的にコピーしています。

これをより迅速に行う方法はありますか?最初にファイルを圧縮する方が良いのでしょうか、それともrsyncを使用するのでしょうか?

4
CJ7

最近、時々遅いcpの速度に戸惑いました。具体的には、df = pandas.read_hdf('file1', 'df')(1.2GBファイルで700ms)に続いてdf.to_hdf('file2')(530ms)が_cp file1 file2_(8s)よりもはるかに高速になる理由は何ですか?

これを掘り下げる:

  • _cat file1 > file2_はこれよりも優れているわけではありません(8.1s).
  • _dd bs=1500000000 if=file1 of=file2_どちらでもない(8.3秒)。
  • _rsync file1 file2_の方が悪い(11.4s)。これは、file2がすでに存在しているため、ローリングチェックサムとブロック更新マジックを実行しようとするためです。

ああ、しばらくお待ちください! _file2_が存在する場合、まずリンクを解除(削除)してみませんか?

今我々は話している:

  • _rm -f file2_:0.2s(以下の図に追加)。
  • _cp file1 file2_:1.0秒。
  • _cat file1 > file2_:1.0秒。
  • _dd bs=1500000000 if=file1 of=file2_:1.2秒。
  • _rsync file1 file2_:4秒。

だからあなたはそれを持っています。ターゲットファイルが存在しないことを確認してください(または、おそらくpandas.to_hdf()で実行されているように、それらを切り捨てます)。

編集:これは、コマンドの前にキャッシュを空にすることなく行われましたが、コメントに記載されているように、これにより、上記のすべての数値に常に3.8が追加されます。

また注目に値する:これは、さまざまなLinuxバージョン(Centos w。2.6.18-408.el5カーネル、およびUbuntu w。3.13.0-77-genericカーネル)、およびext4とext3で試されました。興味深いことに、Darwin 10.12.6を搭載したMacBookでは違いはなく、両方のバージョン(宛先に既存のファイルがある場合とない場合)が高速です。

2
Pierre D

同じパーティション(およびファイルシステム)では、-lハードリンクを実現するにはコピーの代わりに。ハードリンクの作成は、物をコピーするよりもはるかに高速です(もちろん、異なるディスクパーティション間では機能しません)。

小さな例として:

$ time cp -r mydir mydira

real    0m1.999s
user    0m0.000s
sys     0m0.490s

$ time cp -rl mydir mydirb

real    0m0.072s
user    0m0.000s
sys     0m0.007s

これは28倍の改善です。しかし、そのテストでは、約300(かなり小さい)ファイルしか使用していませんでした。いくつかの大きなファイルはより速く実行され、多くの小さなファイルはより遅く実行されます。

1
grochmal

ローカルディスク上のファイルのコピーは、ディスクの読み取りと書き込みに99%使用されます。データを圧縮しようとすると、CPUの負荷は増加しますが、読み取り/書き込みデータは削減されません...実際にはスローダウンコピーになります。

すでにデータのコピーがあり、それを「最新の状態」にする場合、rsyncが役立ちます。

しかし、ツリーの新しいコピーを作成したい場合は、cpコマンドよりもはるかに優れた方法はありません。

1
Stephen Harris