web-dev-qa-db-ja.com

ファイルキャッシュを使用せずに大きなファイルをより速くコピーできますか?

preloadパッケージを追加した後、アプリケーションは高速化されたように見えますが、大きなファイルをコピーすると、ファイルのサイズがファイルのサイズの2倍以上になります。

単一の3〜4 GBの仮想ボックスイメージまたはビデオファイルを外部ドライブに転送することにより、この巨大なキャッシュはプリロードされたすべてのアプリケーションをメモリから削除し、ロード時間の増加と一般的なパフォーマンスの低下につながります。

大きな数ギガバイトのファイルをコピーする方法はありますか?withoutそれらをキャッシュします(つまり、ファイルキャッシュをバイパスします)?または、特定のフォルダーがキャッシュされるのをホワイトリストまたはブラックリストに登録する方法はありますか?

19
Veazer

nocache ユーティリティがあり、ioniceNiceなどのコマンドの前に追加できます。オープンコールにposix_fadviseフラグ付きのPOSIX_FADV_DONTNEEDを追加するライブラリをプリロードすることで機能します。

簡単に言えば、その特定のファイルにはキャッシングは不要であることをカーネルにアドバイスします。カーネルはファイルをキャッシュしません通常。技術的な詳細については here をご覧ください。

E。巨大なコピージョブについては驚異的です。 g。実行中のシステムへの影響を最小限に抑えてバックグラウンドでマルチテラバイトのディスクをバックアップしたい場合は、Nice -n19 ionice -c3 nocache cp -a /vol /vol2に沿って何かを行うことができます。

パッケージはUbuntu 13.10以降で利用可能になります。以前のリリースを使用している場合は、 13.10パッケージ をインストールするか、FrançoisMarierによる this 12.04 backport を選択できます。

18
Gunther Piez

単一の大きなファイルの場合、dddirectI/Oを使用してファイルキャッシュをバイパスします。

1つ(または数個)の大きなマルチギガバイトファイルを転送する場合は、ddを使用すると簡単です。

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • directフラグは、読み取りおよび書き込み中にカーネルの直接I/Oオプション(O_DIRECT)を使用するようにddに指示するため、ファイルキャッシュを完全にバイパスします。
  • bs blocksizeオプションは、物理ディスク操作の数を最小限に抑えるためにddが実行する必要があるため、かなり大きな値に設定する必要があります。深刻な減速。
    • 1〜32 MBの値を自由に試してください。上記の設定は4 MB(4M)です。

複数/再帰的なディレクトリコピーの場合、残念ながら、簡単に利用できるツールはありません。通常のcpなどは直接I/Oをサポートしません

/ e iflags&oflagsが正しいiflag&oflagに変更されました

11
ish

ddおよびfindを使用して、mkdirを使用してディレクトリを再帰的にコピーできます。

2つの問題を回避する必要があります:

  1. ddはディレクトリをどうするかわかりません
  2. ddは一度に1つのファイルのみをコピーできます

まず、入力ディレクトリと出力ディレクトリを定義しましょう。

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

次に、cdをソースディレクトリに入れて、findが、簡単に操作できる相対ディレクトリを報告します。

cd "$SOURCE"

ディレクトリツリーを$SOURCEから$TARGETに複製します

find . -type d -exec mkdir -p "$TARGET{}" \;

$SOURCEから$TARGETにファイルを複製して、書き込みキャッシュを省略しています(ただし、読み取りキャッシュを使用しています!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

ファイルの変更時間、所有権、その他の属性は保持されないことに注意してください。

1
unfa