私は現在cp -r
。
これをより速く行う方法はありますか?まず、ファイルを圧縮するのが良いでしょうか、それとも使用するのが良いでしょうかrsync
?
答え1
最近は時々遅くて混乱していますcp
。具体的には、df = pandas.read_hdf('file1', 'df')
(700msかかる1.2GBファイル)の後にdf.to_hdf('file2')
(530ms)がcp file1 file2
(8秒)よりはるかに速いのはなぜですか?
これについてもっと学びましょう。
cat file1 > file2
あまり良くありませんでした(8.1秒)。dd bs=1500000000 if=file1 of=file2
どちらもありません(8.3秒)。rsync file1 file2
悪い場合(11.4s)は、file2がすでに存在しているため、ローリングチェックサムを実行してアップデートの魔法をブロックしようとすることです。
ああ、ちょっと待って!file2
存在する場合は、まず接続を解除(削除)するのはどうですか?
今、私たちは以下について話しています。
rm -f file2
:0.2秒(下の数字に追加)。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
同じ分割-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個(かなり小さい)ファイルのみを使用しました。いくつかの大きなファイルはより速く実行する必要があり、多くの小さなファイルはより遅く実行する必要があります。
答え3
ローカルディスクにファイルをコピーすると、ディスクからの読み書きには99%の時間がかかります。データを圧縮しようとするとCPU負荷が増加しますが、読み書きデータは減りません。実際にはゆっくりあなたのコピー。
rsyncはすでにデータのコピーがあり、それを「最新」にする場合に役立ちます。
ただし、まったく新しいツリーのコピーを作成したい場合は、コマンドより良い方法はありませんcp
。
答え4
多数のディレクトリをコピーするにはできるcp
実際、レプリカを並列化してレプリケーションアクセラレーションを使用するよりも優れています。
コピーを並列化すると、ドライブは飽和状態になります。最新のSSD(およびある程度HDD)は、多くのI / O要求を受信するとより良いパフォーマンスを発揮します。これは、最適なパフォーマンスを得るために、これらの要求を並べ替え/バッチ/キャッシュできるためです。コピーされるファイルが大きく、オペレーティングシステムがプリパッチを実行しない限り、シングルスレッドコピーがSSDを飽和させる可能性はほとんどありません。一方、マルチスレッドレプリケーションは、多くのファイルの読み取りと書き込みが同時に発生することを保証します。
コピーアクセラレーションは一部のファイルシステムでのみ使用できますが、実際にコピーを実行しないため、他のすべてのシステムよりも優れています。代わりに、元のファイルを「COWed」とマークし、後で2つのファイルのいずれかに書き込むと、実際のコピーが実行されます。これは仕事が遅れるだけであると言うかもしれませんが、「後で」部分は追加情報を提供します。たとえば、特定のディスクブロックのみが変更された場合、ファイルシステムはその新しいブロックのみをコピー/作成し、元のファイルの他のブロックへのポインタを保持できます。または、ファイルシステムがブロックレベルのレプリケーション粒度をサポートしていない可能性がありますが、変更は一部のディスクブロックを完全に上書きするため、複製する必要はありません。私のポイントは、レプリケーションの加速が単に「作業の延期」ではなく、将来を見通すことができるということです。
io_uringはまだコピーアクセラレーションをサポートしていませんが、サポートされている場合は、最小限のオーバーヘッドでコピーに必要なさまざまなタスクを並列に実行することで、効率がさらに向上します。
cp
私はファイルをコピーする最速の方法である唯一の目的のためにマルチスレッドの代替案を作成しました。現時点では、ネストせずに単一のディレクトリをコピーすることは目に見えませんが、Linuxがio_uringでコピーアクセラレーションをサポートすると変更されると予想されます。
ツール:https://github.com/SUPERCILEX/fuc/tree/master/cpz
基準:https://github.com/SUPERCILEX/fuc/tree/master/comparisons#copy