現在、cp -r
を使用して、同じディスクに多数のディレクトリとファイルを再帰的にコピーしています。
これをより迅速に行う方法はありますか?最初にファイルを圧縮する方が良いのでしょうか、それともrsync
を使用するのでしょうか?
最近、時々遅い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では違いはなく、両方のバージョン(宛先に既存のファイルがある場合とない場合)が高速です。
同じパーティション(およびファイルシステム)では、-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(かなり小さい)ファイルしか使用していませんでした。いくつかの大きなファイルはより速く実行され、多くの小さなファイルはより遅く実行されます。
ローカルディスク上のファイルのコピーは、ディスクの読み取りと書き込みに99%使用されます。データを圧縮しようとすると、CPUの負荷は増加しますが、読み取り/書き込みデータは削減されません...実際にはスローダウンコピーになります。
すでにデータのコピーがあり、それを「最新の状態」にする場合、rsyncが役立ちます。
しかし、ツリーの新しいコピーを作成したい場合は、cp
コマンドよりもはるかに優れた方法はありません。