錦です。
皆さんはどんな記憶媒体をお使いに慣れているでしょうか。もう最近であれば、いわゆるM.2 SSDと呼ばれるNVMe SSDや、少し安ければUFSやeMMCを利用している方もいるでしょう。今回はその容量についてのお話です。
記事の最初の方は、マニアックな話をしているので、賢い保存術だけを知りたい方は目次で項目をぶっ飛ばしてください。
ファイルシステム
基本的にSDカードやUSBメモリ、SSD、HDD、UFSなどを含む全ての記憶媒体は「ファイルシステム」というものが採用されています。このファイルシステムは、簡単に言うとソフトウェアがどこにファイルが有るのか、どうやってそのファイルを保存すればいいのかを定めたものです。
ファイルシステムにはいくつもの種類があります。例えば、Windowsで用いられているファイルシステムは「NTFS」というもの、Macで用いられているのは「APFS」というものです。これらには互換性がありません。そのため、APFSというファイルシステムでフォーマットされたボリューム(記憶媒体)はWindowsで利用することが原則できません。
また、ファイルシステムには「ブートセクタ」と呼ばれるものを持っており、これがなければOSを起動することもできないというもの。つまりシステムの根源で最も重要なものの一つです。
ファイルシステムのデータ管理
ではファイルシステムがどのようにデータを保存しているのかについて解説していきます。記憶媒体も現実世界と同じように「整理整頓」が必要になります。その整理整頓の仕方はファイルシステムによって異なりますが、おおよそ共通していることがあります。それは「クラスタ」と呼ばれる仕組みを利用していることです。
クラスタは、棚やロッカーで例えると一つの「部屋」と言いかえることができます。そして、その部屋のなかをもっと細かく区切ったものを「セクタ」といいます。今回の話はクラスタを理解していれば構わないのでセクタについての話は飛ばします。
クラスタのサイズは有限であり、ファイルシステムによってそのサイズは決まっています。なので、ファイルのサイズが大きければ一つのクラスタに収まりきらないことになります。
その場合は、複数のクラスタに分けて保存することになります。現実世界で大きなぬいぐるみを収納するとして、入り切らないからと言って頭と四肢をぶった切って収納したらグロテスクなことになってしまいますが、デジタルデータはただの1と0の羅列なので、任意のタイミングでぶった切ってその続きを別の場所に収納するなんて言うことは簡単にできます。読み込む時にくっつければいいのですから。
ただ、0と1の羅列をぶった切って好き勝手に収納していいかと言われればそうではなく、この続きがどこにあるのかというのはしっかり把握しておく必要があります。そういったファイルの位置やクラスタを管理しているのがMaster File Table(MFT)やFile Allocation Table(FAT)と呼ばれるファイルです。このファイルはシステムによって名称が異なります(図ではNTFSのMFTを使用しています)。
クラスタとファイルシステムの特徴
そして、デジタルならではの特徴がもう一つあります。それは、クラスタ1つあたりに最大1つのファイルしか保存できないというものです。ちなみに今回の話の肝となります。
先程申し上げたとおり、ファイルというのはクラスタに保存されていきます。しかし、そのクラスタには2つ以上のファイルが同居することは原則としてできません。そのため、ファイルのデータが1bitだけだったとしても、クラスタ1つ分の容量を消費します。
皆さんはWindowsやMacのプロパティでファイルやフォルダのサイズを見るとき「サイズ」と「ディスク上のサイズ」で別れていることにお気づきでしょうか。そして、「サイズ」に比べて「ディスク上のサイズ」が大きいことにもお気づきでしょうか。これはこのクラスタの特徴によるものなのです。
マイクラのバックアップをex-FATでフォーマットしたSDカードに非圧縮で保存したんだけど、実際のサイズとディスク上のサイズの乖離がエグい。細かなファイルが多いのが問題なんだよなぁ。 pic.twitter.com/ZOmIQEwPJP
— nishikiout@Nishiki-Hub (@nishikiout) 2022年10月23日
このツイートに掲載した画像はその極端な例です。これはMinecraftのどでかいセーブデータを圧縮せずにSDに保存したところ、22,822ものファイルがすべて1つ以上のクラスタを消費したことで実際の容量とディスク上の容量で倍以上の差が生まれたものです。
ex-FATというファイルシステムはSDカードやUSBなどで採用されていることが多いシステムです。理由としてはどんなOSとも互換性がある成熟したものであるからというのが挙げられます。しかし、このファイルシステムは残念ながらクラスタサイズが大きく、NTFSが4KBであるのに対して128KBと非常に大きいのです。そのため、言ってしまえば、ストレージロスが大きくなってしまい、それが積み重なることで2倍以上、4GBのデータに対して、5GB近くのロスを生み出したと言うことになります。
簡単に今行ったことをまとめると、いくら一つ一つのファイルのサイズが小さくても、ファイル数が多ければ大変なことになるということです。どんなファイルシステムであれ、NTFSを除けば*1ファイルの総数×クラスタサイズを使用容量が下回ることがありません。
賢い保存術
これらのことを踏まえて、賢い保存術をお伝えすると、簡単に「zipに圧縮する」となります。
理由は、クラスタは最大1つしかファイルを保存できないわけです。なので、多数のフォルダがある状態で、保存した場合は、最低でもファイル数分のクラスタを消費しますが、圧縮すれば最低限必要な分のクラスタ消費で済みます。それに加え、圧縮によってファイルサイズ自体も小さくなります。
そもそものサイズは4.32GBから2.61GBに大幅に小型化されている他、ディスク上のサイズと実際のサイズの差は、非圧縮時に5.16GBだったものが、圧縮することによって213MBまで大幅に縮まっています。これによってディスク上のサイズは、27%にまで圧縮されていますね。
もちろん、SDカードなどにデータを保存する目的によって圧縮するというのは最適な手段といえない場合もありますが、単純にデータを逃したいから、ローカルストレージの空き容量を増やしたいからといった場合には圧縮して保存することで、本体サイズのみならず、ファイルシステムによるロスも防ぐことができるでしょう。