web-dev-qa-db-ja.com

スパースファイルとは何ですか。なぜ必要なのですか。

スパースファイルとは何ですか。なぜ必要なのですか。私が得ることができる唯一のものは、それが非常に大きなファイルであり、効率的である(ギガバイト単位)ことです。どのように効率的ですか?

15
Luv33preet

空のバイトが\x00多いファイルがあるとします。これらの多くの空のバイト\x00はホールと呼ばれます。空のバイトを保存することは効率的ではありません。ファイルにそれらの多くがあることがわかっているので、なぜそれらをストレージデバイスに保存するのでしょうか。代わりに、それらのゼロを説明するメタデータを保存できます。プロセスがファイルを読み取ると、これらのゼロバイトブロックは、物理ストレージに格納されるのではなく動的に生成されます(Wikipediaのこの図を参照)。

Sparse File - 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は空のゼロのみを含むブロックを検出して割り当てを解除しました。このファイルのすべてのブロックにはゼロが含まれているため、すべて割り当て解除されました。

また、サイズが同じであることに注意してください。これはファイルの論理(仮想)サイズであり、ディスク上のサイズではありません。 outputphysicalストレージ領域を占有していないことを知ることは非常に重要です。割り当てられているブロックが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)を確認してください。

11
direprobs

スパースファイルは、ほとんどが空のファイルです。つまり、値が0(ゼロ)の大きなバイトブロックが含まれています。

ディスクでは、ファイルのコンテンツは固定サイズ(通常は4 KiB以上)のブロックに格納されます。そのようなブロックに含まれるすべてのバイトが0である場合、スパースファイルを実装するファイルシステムはブロックをディスクに格納せず、代わりにファイルメタデータのどこかに情報を保持します。

スパースファイルを使用する利点:

  • 空のデータブロックはディスク領域を占有しません。それらはデータの通常のブロックとして保存されず、それらの識別子(数バイトのみを使用)は代わりにファイルメタデータに保存されます。このようにして、空のブロックごとに4 KiB(またはそれ以上)のディスク領域が節約されます。
  • スパースファイルから空のデータブロックを読み取るのに時間がかかりません。これは、データがディスクから読み取られないために発生します。ファイルシステムは、ブロック内のすべてのバイトが0であることを認識しているため、入力バッファ内のすべてのバイトを0に設定するだけで、データの準備が整います。遅いストレージデバイスにアクセスする必要はありません。
  • 空のデータブロックをスパースファイルに書き込むのに時間がかかりません。書き込み時に、ファイルシステムはブロックが空であることを検出し(そのバイトはすべて0です)、ブロックIDを空のブロックのリスト(ファイルメタデータ内)に入れます。データはディスクに書き込まれません。

スパースファイルの詳細については、 Wikipediaページ を参照してください。

2
axiac