スパースファイルとは何ですか。なぜ必要なのですか。私が得ることができる唯一のものは、それが非常に大きなファイルであり、効率的である(ギガバイト単位)ことです。どのように効率的ですか?
空のバイトが\x00
多いファイルがあるとします。これらの多くの空のバイト\x00
はホールと呼ばれます。空のバイトを保存することは効率的ではありません。ファイルにそれらの多くがあることがわかっているので、なぜそれらをストレージデバイスに保存するのでしょうか。代わりに、それらのゼロを説明するメタデータを保存できます。プロセスがファイルを読み取ると、これらのゼロバイトブロックは、物理ストレージに格納されるのではなく動的に生成されます(Wikipediaのこの図を参照)。
スパースファイルはディスクにゼロを格納しないため、スパースファイルが効率的である理由です。代わりに、生成されるゼロを記述する十分なデータを保持します。
注:論理ファイルのサイズは、スパースファイルの物理ファイルのサイズよりも大きくなります。これは、ゼロを物理的にストレージデバイスに格納していないためです。
編集:
実行すると:
$ dd if=/dev/zero of=output bs=1G count=4
ここでのコマンドは、ヌルバイトの4Gブロックをoutput
にコピーします。それを見るには:
$ stat output
File: ouput
Size: 4294967296 Blocks: 8388616 IO Block: 4096 regular file
--omitted--
このファイルには、8388616ブロックが割り当てられていることがわかります。これらのブロックには、/dev/zero
からコピーされた空のバイト以外は何も保存されていません。物理ディスクスペースを占有します。これらはディスクに格納されたホールです(スパースゼロ)。 dd
は、データブロックを1つのファイルから別のファイルにコピーして、要求したことを行いました。
次に、このコマンドを実行してホールを検出し、ファイルをインプレースでスパースにします。
$ fallocate -d output
$ stat output
File: swapfile
Size: 4294967296 Blocks: 0 IO Block: 4096 regular file
--omitted--
何か気づきましたか?空のバイトのみを格納していたブロックが割り当て解除されたため、ブロックの数は0になりました。 output
のブロックは何も格納せず、空のゼロの束のみを保存します。fallocate -d
は空のゼロのみを含むブロックを検出して割り当てを解除しました。このファイルのすべてのブロックにはゼロが含まれているため、すべて割り当て解除されました。
また、サイズが同じであることに注意してください。これはファイルの論理(仮想)サイズであり、ディスク上のサイズではありません。 output
がphysicalストレージ領域を占有していないことを知ることは非常に重要です。割り当てられているブロックが0であるため、実際にはディスク領域を使用していません。 fallocate -d
を実行した後もサイズは保持されるため、後でファイルから読み取るときに、実行時にファイルシステムによって空のバイトが生成されます。ただし、output
の物理サイズはゼロです。データブロックは使用しません。
output
ファイルを読み取ると、実行時に空のバイトがファイルシステムによって動的に生成され、実際にはディスクにない物理的に保存されており、ファイルのサイズstat
によって報告されるのは論理サイズであり、output
の物理サイズはゼロです。この場合、プロセスがファイルを読み取るときに、ファイルシステムは4Gの空のバイトを生成する必要があります。
dd
を使用してスパースファイルを生成するには:
$ dd if=/dev/zero of=output2 bs=1G seek=0 count=0
$ stat
stat output2
File: output2
Size: 4294967296 Blocks: 0 IO Block: 4096 regular file
GNU dd
は内部でlseek
およびftruncate
を使用するため、truncate(2)およびlseek(2)を確認してください。
スパースファイルは、ほとんどが空のファイルです。つまり、値が0
(ゼロ)の大きなバイトブロックが含まれています。
ディスクでは、ファイルのコンテンツは固定サイズ(通常は4 KiB以上)のブロックに格納されます。そのようなブロックに含まれるすべてのバイトが0
である場合、スパースファイルを実装するファイルシステムはブロックをディスクに格納せず、代わりにファイルメタデータのどこかに情報を保持します。
スパースファイルを使用する利点:
0
であることを認識しているため、入力バッファ内のすべてのバイトを0
に設定するだけで、データの準備が整います。遅いストレージデバイスにアクセスする必要はありません。0
です)、ブロックIDを空のブロックのリスト(ファイルメタデータ内)に入れます。データはディスクに書き込まれません。スパースファイルの詳細については、 Wikipediaページ を参照してください。