
警告:このグラフは、まだ取り上げていない記事の第2部のスクリプト用に作成されています。 したがって、その中のデータに注意を払ってはいけません。 この記事のグラフは最後にあります。
この記事の情報は自己責任で使用してください。 ファイルからデータを消去します。 この記事は、WindowsオペレーティングシステムとNTFSファイルシステムについて書かれています。 記事には多くの画像もあります。
スパースファイルとは
スパースファイルは、ゼロバイトのシーケンス[1]がこれらのシーケンスに関する情報(ホールのリスト)に置き換えられたファイルです。
ホールとは、ディスクに書き込まれないファイル内のゼロバイトのシーケンスです。 ホールに関する情報(バイト単位のファイルの先頭からのオフセットとバイト数)は、FSメタデータに格納されます。
また、Geektimesに関する短い記事「 NTFSのスパースファイル 」もあります 。
オペレーティングシステムは、デフォルトではスパースファイルを作成しません。 このフラグは、プログラムで、またはユーティリティを使用してファイルに設定できます。
ユーティリティを使用してフラグを設定します。
fsutil sparse setflag < >
プログラムで(C ++ Windows):
DeviceIoControl( m_hFile, FSCTL_SET_SPARSE, NULL, 0, NULL, 0, &dwOut, NULL )
ファイル内のシーケンスを自動的にゼロにしても、ディスク容量が解放されることはありません。これは、プログラムまたはユーティリティを使用して行う必要もあります。
ユーティリティヘルプファイルのゼロ:
fsutil sparse setrange < > <> <>
プログラムで(C ++ Windows):
FILE_ZERO_DATA_INFORMATION range; range.FileOffset.QuadPart = start; range.BeyondFinalZero.QuadPart = start + size; DeviceIoControl( m_hFile, FSCTL_SET_ZERO_DATA, &range, sizeof(range), NULL, 0, &dwOut, NULL );
シンプルなファイル
それらのために、ファイル内のスペースを解放する特別なユーティリティがあります。これにより、ゼロの大きなシーケンスが破損することなくゼロになります。 しかし、そのようなファイルはまれです。
ダウンロード可能なファイル
- スパースフラグを使用すると、ファイルはロードされたデータが必要とする量を占有します。 これは、ダウンロードキューに多くのファイルがあり、それらの合計サイズが使用可能なサイズを超える場合に役立ちます。
パーツのハッシュにより、ゼロで満たされたパーツを判別し、すでにロード済みとしてマークできます。 これらの部品はロードされず、ディスク容量を占有しません。
トレントで空のピースを見つけるための関数(C ++ Shareaza)BTInfo.cpp :
BOOL CBTInfo::IsZeroBlock(uint32 nBlock) const { static const uint32 ZeroHash[22][5] = {
短所:
ファイルは断片化されています。 これは通常のファイルでも発生しますが、スパースファイルではより顕著になります。 ファイルはランダムにダウンロードされ、必要に応じてデータ用のスペースが割り当てられます。 ファイルの断片はディスク全体に散らばっています。
ディストリビューション上の不要なファイルの部分的な消去。
スパースファイルを使用すると、他のデータ用の領域を徐々に解放できます。 fsutil sparse setrange
指定されたセクションfsutil sparse setrange
解放され、ゼロからのみ読み取られます。
これらのファイルを再確認すると、クライアントは間引きセクションをロードされていないものとしてマークし(最初にゼロがなかった場合)、それらを配布しません。 彼がそれらを再びダウンロードしようとしないように、ダウンロードボックスのチェックを外す必要があります。 この場合、ファイルのセクション全体がswarmで使用可能のままになります。
メリット:
- したがって、新しいトレントをダウンロードするために十分なスペースを解放しながら、ディストリビューションにとどまることができます。
- ディストリビューションに残り、他のソースへの負荷は増加しません。
- 配布するソースが多いほど、ダウンロード速度は速くなります。
例

ファイル「linux.iso」があります。 そのサイズは1.4ギガバイトです。 新規ダウンロードの場合、1ギガバイトの十分な空きディスク容量がありません。
fsutil sparseを直接使用する(正しくない!)
fsutil sparse setflag linux.iso fsutil sparse setrange linux.iso 0 1073741824
1ギガバイトのディスク領域を解放しましたが、この方法でファイルの先頭にある大きな連続した部分をクリアします。 他のソースがこれを繰り返すと、ファイルの最後に利用可能な部分が過剰になり、完全なソースがないとその先頭に完全にアクセスできなくなる可能性があります。
ランダムな位置を選択する簡単なスクリプトを書きます
大きい数値が使用されるため、便宜上JavaScriptで計算を実行します
sparse_light.js
ファイルサイズの取得とfsutil sparseの操作は、バッチファイルに残ります。
sparse_light.cmd
@rem %1 @rem %2 @setlocal @rem @echo This script will erase some of the data (%2 bytes) from the file: %1 @set /P AREYOUSURE=Are you sure (Y/[N])? @if /I "%AREYOUSURE%" NEQ "Y" goto END @rem fsutil sparse setflag %1 @rem sparse_light.js for /f "tokens=1,2" %%i in ('cscript //nologo "%~dp0sparse_light.js" %~z1 %2') do ( fsutil sparse setrange %1 %%i %%j ) :END @endlocal
私たちは電話します:
sparse_random.cmd linux.iso 1073741824
このスクリプトは、ファイルの1つまたは2つのランダムセクションを上書きします。 このスクリプトは、単一のファイルを上書きするのに適しています。
qBittorentでスクリプトを使用する例(多くのスクリーンショット)
- qBittorentを開く

- 目的のトレント(この場合はlinux.iso)を選択します。 コンテキストメニューを呼び出し、[一時停止]をクリックします。

- スクリプトを使用してファイルを切り取ります。
sparse_light.cmd G:\linux\linux.iso 500000000

- 指定された量のディスク領域を必ず解放します。 ファイルのプロパティを開き、「サイズ」と「ディスク上のサイズ」を比較します。

- qBittorentでは、コンテンツタブに切り替えます
![[コンテンツ]タブ。ファイルの横にチェックマークがあります](https://habrastorage.org/webt/ob/lj/qo/obljqooiy73blfrkxco1l4sbtlk.png)
- ファイルの横にあるチェックボックスをオフにして、検証後に再びロードが開始されないようにします
![[コンテンツ]タブ。ファイルの横にあるチェェククマーがオフになていますす](https://habrastorage.org/webt/mt/na/wr/mtnawrdpjntuy_ffb5ade-fdxvg.png)
- ディストリビューションを右クリックしてコンテキストメニューを呼び出し、「強制チェック」項目をクリックします

- はい、選択したトレントを再確認したいと確信しています。

- チェックが完了した後。 ディストリビューションを右クリックしてコンテキストメニューを呼び出し、[再開]アイテムをクリックします。

- だから私たちは手元にとどまり、ディスクスペースを解放しました

- ディストリビューションを右クリックしてコンテキストメニューを呼び出し、「移動」アイテムをクリックします(最初のアイテムでこれを行う必要がありますが、今日はそれについて考えました)

- ディレクトリ内のファイルが使用に適さないことが明確になるように、ディレクトリの名前を選択します。

SVGでの統計のカウント

ファイルは100ブロックに分割されます。 チャートでは、完全なブロックのみが考慮されます。 グリッド内の各行は、1つの群れエミュレーションです。 マイルストーンのあるグリッドの下に、アクセシビリティグラフが一番下に表示されます。
- 青色のグラフの各ブロックの下の列は、完了したサイクルの数を示しています。
- 濃い青(実際には半透明の灰色)チャートでは、利用可能なデータの割合が左(0%)から右(100%)に表示され、この割合が上から下に利用可能なサイクル数が表示されます。
エミュレーションで遊んでみたい人のために: https : //ivan386.imtqy.com/sparse_light/emulator.svg
キーボード制御:
P/
一時停止
+/=
-1つのソースを追加
-/_
-1つのソースを削除する
マウス制御:
グリッドをクリックすると、すべてのソースから消去される割合を選択できます。 右に行くほど消去されます。
グラフを解析する
- 5つのソースが異なる位置からファイルの81%を消去しました。 ただし、ほとんどのサイクルで64%が利用可能です。 ほとんどの場合、端のブロックにはアクセスできません。

- 5つのソースが異なる位置からファイルの49%を消去しました。 ファイルの88%はまだ使用可能です。
ファイルの半分未満が解放されるため、スクリプトは消去する位置を選択します。 したがって、ファイルの中央では、ブロックはエッジよりもアクセスしにくくなります。

- 5つのソースが異なる位置からファイルの52%を消去しました。 ファイルの86%はまだ使用可能です。
ファイルの半分以上を消去するために選択します。 この場合のスクリプトは、データの位置を選択し、このピースの前後で消去します。

- 5つのソースが異なる位置からファイルの40%を消去しました。 ファイルの100%のみが使用可能です。 ここでは、5つのソースを持つファイルの最大40%を消去すると、100%のファイルアクセシビリティが得られる可能性が高いことがわかります。

チャート2と3は互いに相殺します。
おわりに
ディスク領域を解放するこの方法は、大きなファイルを含む配布に適しています。 コンテンツが不要になったら、一部を消去して残りを配布できます。
ソース
- スパースファイル
- NTFSのスパースファイル
- FSCTL_SET_SPARSE制御コード
- FSCTL_SET_ZERO_DATA制御コード
- FILE_ZERO_DATA_INFORMATION構造
- Windowsバッチファイルで "are you sure"プロンプトを表示するにはどうすればよいですか?
- バッチスクリプトの呼び出しで読み取ることができる環境変数をvbsに設定する方法