ファイルのフラグメンテーション(断片化)を可視化して勉強する
基本情報や応用情報では出題されるファイルのフラグメンテーションという現象があります。
いろんな参考書や説明を聞いたりして頭の中ではなんとなくイメージできそうですが、実際にどんな動作をしているのか可視化することで理解が深まります。
そこで今回はSysinternalsのDiskViewというツールを利用して、ファイルのフラグメンテーションを可視化、観測してみたいと思います。
DiskViewとは?
MicrosoftはSysinternalsという開発者向けツール郡を無償公開しています。
このツール郡の中にDiskViewというツールがあり、このツールを利用するとボリューム上のどの番地(アドレス)になんのデータが格納されているのかを可視化することができます。
(昔のWindowsではデフラグというツールを実行すると似たような画面が表示されていたりしました)
今回はこのツールを利用しながら、手動でフラグメンテーションを起こしたときにどのようにファイルがディスク上に記録されているのか観測してみたいと思います。
フラグメンテーションの準備
DiskViewのダウンロード
下記URLからDiskViewのダウンロードをしてください。
https://learn.microsoft.com/ja-jp/sysinternals/downloads/diskview
ZIPファイルでダウンロードされるので、解凍しておきましょう。
今回は”DiskView64.exe”を利用します。
ダミーデータの作成
意図的にファイルのフラグメンテーションを起こしやすいように、事前に100KB、800KB、1MBのダミーデータを準備します。
コマンドプロンプトで下記コマンドを実行してダミーデータを作成します(下記コマンドではDドライブ直下に作成していますが、保存場所はどこでも構いません)。
fsutil.exe file createnew D:\testfile_1MB 1048576
fsutil.exe file createnew D:\testfile_800KB 819200
fsutil.exe file createnew D:\testfile_100KB 102400
こんなかんじになります。
検証用ボリュームの作成
最近のパソコンは記憶容量がGB単位も当たり前の時代になりましたが、DiskViewを利用するうえではクラスタの数(DiskViewで表示される□の数)が多くなりすぎて扱いづらいです。
そこで今回は、扱いやすいように容量の小さな検証用ボリュームを準備します。
コンピュータの管理⇒記憶域⇒ディスクの管理 と進んで、任意のボリュームを10MBだけサイズ縮小します。
ここではCドライブを縮小します。
10MBだけ縮小します。
小さな未割当領域が出現しますので、新しいシンプルボリュームを作成します。
10MBで新規作成します。
ドライブ文字は空いている文字を適当に割り当ててください。
今回は条件を合わせるために、”NTFSのクイックフォーマット”をしてください。また、アロケーションユニットサイズ(クラスタサイズ)も既定値から変更しないでください。
ボリュームラベルはなんでもOKです。
それでは完了しましょう。
DiskViewでボリュームの状態を確認
事前にダウンロードしておいたDiskView64.exeを起動します。ディスクの中身に直接アクセスする都合なのか、実行には管理者権限が必要です。
起動した直後の場合は利用規約の同意画面が表示されることがありますが、Agreeをクリックして進めます。
最初は何も表示されていない画面です。
画面左下のVolumeを先ほど作成した検証用ボリュームに変更してRefreshボタンをクリックしましょう。
すると、下記画像のようなFile Errorsが表示されることがありますが、こちらは今回の事例ではあまり気にしなくてOKボタンクリックで問題ありません。
そのまま進めると、下記画像のような画面が表示されます。画面上部に何やら緑の線や青っぽい線が見えます。
このままではよくわからないのでZoomの▲ボタンをクリックして拡大してみましょう。
はい、拡大すると色のついた□が並んでいることがわかります。
この□1つがNTFS既定値では4KByte(アロケーションユニットサイズ既定値)になります。
色の意味は下記画像のとおりです。
青色がファイルとして存在するクラスタ(エクスプローラ等からアクセスできるファイル)、明るい緑がシステムファイルクラスタ(エクスプローラ等からアクセスできないファイル)、白が未使用クラスタ、薄い緑がMFT(Master File Table:ファイルやフォルダの配置情報が記録される領域)専用クラスタです。
試しに上の方にある青い部分をクリックすると、Eドライブ直下に格納されている$upcaseという名前のファイルということがわかります。
ファイルを操作してフラグメンテーションを起こす
それでは準備が終わりましたので、ここからフラグメンテーションを起こすようなファイル操作をしていきます。
フラグメンテーションを起こすには、ファイルをコピーする順番も重要です。下記の手順をどこかで間違ってしまった場合は、ボリュームをフォーマットしてからやり直してください。
まずは800KBのダミーデータを検証用ボリュームにコピーします。すると先頭に存在していた未割当領域が青い割り当て済みに変化します。
続いて100KBのダミーデータをコピーします。コピーしたら、さらにその100KBのダミーデータをCtrl+Cでコピーして、Ctrl+Vを繰り返してコピー(18)になるまで貼り付けます。
DiskViewでは下記のようなファイル配置になりました。
続いて、"testfile_100KB"と偶数番号のついた100KBダミーデータを完全に削除します。
削除した後のファイル配置は下記のようになります。
下半分で未割当の空白と割り当て済みの青色が繰り返し出現していることがわかります。
そして1MBのダミーデータをコピーしてみます。そうすると、データの配置は下記のようになりました。
ファイルのデータ配置は優秀なので、できるだけフラグメンテーションしないようにデータが配置されます。
1回目の1MBファイルコピーでは断片化している100KBの未割当領域にはデータが配置されず、その後ろの幅が大きな空き領域にデータが配置されました。
ここから1MBのダミーデータを徐々に増やしていくとどうなるか観測します。
2個に増やした
3個に増やした
はい、3個に増やした時点でフラグメンテーションが発生しました。赤い部分がフラグメンテーションによりファイルが途中で分断されていることを示しています。
3個目の1MBのダミーデータ(testfile_1mb – コピー – コピー)が保存されているクラスタをクリックすると、黄色いハイライト表示で複数の塊に分断されていることがわかります。
もう1MB入りそうだったので、もう1回コピーしてみました。
すると、さらに分断されて一部はMFT予約領域にまで侵食してきました。どうやらMFT予約領域は不可侵というわけではなさそうです。
何気なくファイル保存している日々ですが、実は内部ではこんなことが行われてたりしました。
補足:ファイルアクセス速度とフラグメンテーション
ファイルアクセスの速度はフラグメンテーションが起きていない方が早いです。
フラグメンテーションが発生していなければクラスタを順番に読み込んでいくことができます。しかし、フラグメンテーションが発生しているクラスタ(赤いクラスタ)にアクセスがあると、次のクラスタ番地を探し出す必要があります。
特にHDDの場合は次のクラスタ番地を読み込むためにディスクヘッダの位置を物理的に変更しなければならず、そのための時間(シーク時間)がフラグメンテーションの回数分発生します。
例えば、今回実験した1MBのファイルは下記のように5つに分断しているため、4回のフラグメンテーション読み込みが発生してしまうことになります。
ただし、この影響が生じるのはエクスプローラなどでファイル単位のデータ読み書きをした場合です。
いろいろなバックアップソフトで行われるボリュームコピーやディスク丸ごとバックアップでは、フラグメンテーションクラスタかどうかは無関係にディスクの先頭から順番に読みだしていくので高速(ディスクの理論値に近い読み込み速度)で処理できます。
まとめ
- DiskViewでファイルのフラグメンテーションを可視化できます。
- 空き容量が少なくなってくるとフラグメンテーションは発生しやすくなります
- やってみると意外と面白いです(個人の感想)