web-dev-qa-db-ja.com

連続コピー–ファイルを連続コピーするにはどうすればよいですか?

個々のファイルが連続するように、いくつかのファイルをフラッシュドライブにコピーしたいと思います。それらは互いに隣接している必要はなく、任意の順序にすることができます。ファイルは非常に大きくなり、数百メガバイトからギガバイトになります。ドライブ上の他のファイルをデフラグしないでください。これを行うと、時間が無駄になり、フラッシュメディアに不要な摩耗が発生します。

少なくともFAT32でこれを実行できるようにしたいのですが、*nixファイルシステムのメソッドも高く評価されます。

基本的に、これには2つのアプローチがあります。

  • ファイルをコピーして最適化します。
  • 各ファイルに十分な連続した空き領域をデフラグしてから、各ファイルをその場所にコピーします。

2番目のオプションは一般に1番目のオプションよりもはるかに高速であり、フラッシュメディアに不要な摩耗を引き起こすことを回避するため、2番目のオプションが非常に望ましいでしょう。

オフラインで機能するソリューションは構いませんが、明らかにオンラインの方が望ましいです。

6
James Haigh

私はあなたが何をしようとしているのか本当に理解していないことを認めなければなりませんが、それは重要ではないと思います。 defragfsと呼ばれるこのツールを見つけました。これは、あなたが求めていることを実行することを目的としています(あなたが実行しようとしていることを理解している場合)。

http://defragfs.sourceforge.net/index.html

ただし、このツールの特徴は、afterのデフラグであると思います。ここで、ファイルを書き込むときに、本質的にそれを保証しようとしていると思います。ディスク、それは順番に行われていること。このStackOverflowQ&Aのタイトル: Linuxの連続ディスクブロックにファイルを保存する方法 によると、書き込みが行われる方法のアーキテクチャを考えると、可能ではないようです。

このQ&Aを締めくくるために、次のリソースが役立つと思われることがわかりました。

3
slm

少なくともFAT32で可能ですが、ツールの名前を思い出せません。

私が正しく覚えているのは、完全な長さの穴の最初の呼び出しに基づいており、それを新しいストリームに割り当てると、ファイルはそのストリームで読み書きされます。

私の記憶が正しければ、事前割り当てコピーを介したNTFSでも可能です。

しかし、NTFS圧縮ファイルの場合、方法はありません... Windowsが最初にファイル(非圧縮)を書き込み、その後、ファイルをチャンクに圧縮するので...実を言うと、パイプラインでそれを行います...これがファイルが非常に断片化される理由です(10GiBのファイルは10万を超えるフラグメントを作成できます)。

NTFS圧縮が有効になっている場合にそれを回避できるツール/コマンドはわかりません。私はずっと前に、Windowsで断片化を引き起こさずにコピーするためのNice GUIを備えたツールを使用しましたが、名前を思い出せないようです。

したがって、私が言える最善のことは、WindowsでコマンドラインユーティリティXCOPY/Jフラグとともに使用することです。

NTFS圧縮が無効になっている場合、またはFAT32を使用している場合は、大きなファイルに最適です。

NTFS圧縮パイプラインの断片化の説明:

  1. ブロックNはクラスターNに書き込まれます
  2. N +#の周りのクラスターは圧縮されて別の場所に保存されるため、NとN +#の間のクラスターは解放されます。つまり、ファイルは断片化され、非常に断片化されます。 10GiB = 100000フラグメント、50%の圧縮を想定しているため、NTFS圧縮は非常に悪いです。ファイルが最初にRAMで圧縮され、次にディスクに送信される場合、断片化は発生しないか、少なくとも回避できます。

この方法のもう1つの副作用は、5Gibの空き領域があり、圧縮後に3GiBしかかからない6GiBのファイルを作成したいということです。これは不可能ですが、最初に2GiB(非圧縮)を別の場所に移動すると、空き容量は7GiBになり、6GiBと書き込み、圧縮すると3GiBになり、空き容量は4GiBになり、元の2GiBに戻します。移動したデータと出来上がりはすべてそこにあり、2GiBは無料です。重要なのは、非圧縮ファイル用の十分なスペースがない場合、NTFSにコピーすることはできず、NTFS圧縮後に十分なスペースがあるかどうかは問題ではないということです。最初に圧縮せずに書き込み、次に圧縮を適用するため、すべてが必要です。最後に、NTFSドライバーはパイプラインでそれを行うので、理論的にはそれでも可能ですが、チェックの空きサイズの部分は変更されませんでした。

Windowsはファイルを圧縮後「圧縮」せず、Windowsはファイルを非圧縮で保存「後」に「圧縮」します。したがって、各クラスターについて、ハードディスクは2回の書き込み試行を確認します。1回目は非圧縮データ、2回目は圧縮データです。最新のパイプラインNTFSコントローラーは、HDDが両方の書き込みを認識しないようにしますが、最初のNTFSバージョンでは、HDDはファイル全体を非圧縮で書き込み、次にファイルを圧縮します。非常に大きく、十分に圧縮可能なファイルで非常に目立ちました。 NTFSがわずか数MiBに圧縮した10GiBのファイル(ゼロで埋められたファイル)の書き込みは、非圧縮バージョンのファイルの書き込みよりも書き込みに時間がかかりました。今日、パイプラインはそれを破り、今ではほんの少しの時間しかかかりませんでしたが、以前の十分な空きサイズはまだそこにあります。

うまくいけば、いつの日かNTFS圧縮方式で行が実行されるので、書き込み後にフラグメント化を解除しなくても、フラグメント化されていないNTFS圧縮ファイルを取得できます。それまでは、/JフラグとXCOPYを付けたCONTIG、または名前を思い出せないGUIツールが最適です。それは、WindowsがXPまでしかなく、一時停止したり、HDD1からHDD2に、HDD3からHDD4に並行してコピーしたり、もちろん事前に割り当てたりするオプションがあったときでした。うまくいけば、これが役立ちます!

2
Claudio