仕組み
ストレージの単位には数え方が 2 通りあり、どちらも正しいものです。ディスクメーカーと国際単位系が使う 10 進法は、接頭辞ごとに 1000 倍します。1 kB は 1,000 バイト、1 MB は 100 万、1 TB は 1 兆バイトです。一方、コンピューターとともに生まれた 2 進法は 1024 倍します。メモリーやバスが 2 の累乗でアドレス指定されるからです。
問題は、この 2 つの体系が何十年も同じ名前を使ってきたことです。Windows のエクスプローラーが「GB」と書くとき、実際に計算しているのはギビバイト、つまり 1024 で 3 回割った値です。そのため、ちょうど 1 兆バイトを収めた 1 TB のディスクが画面上では 931.32 GB と表示されます。減っているものは何もなく、数える物差しが変わっただけです。1998 年からは IEC 80000-13 規格が、2 進接頭辞 KiB、MiB、GiB、TiB でこの曖昧さを解消しています。
このツールは容量を 10 進・2 進・ビットの 3 系統へ同時に変換し、正確なバイト数、メーカーが表示する数値、OS が表示する数値を、その差の割合とともに示します。計算はすべてブラウザー内で行われます。
例
1 TB931,32 GBディスクには箱の表記どおり 1,000,000,000,000 バイトが入っています。OS はそれを 1024 で 3 回割って 931.32 GB と表示しますが、正確には 931.32 GiB です。画面上では 69 GB ほど足りないように見えても、ディスク上では 1 バイトも欠けていません。1 GiB1073741824 B1 ギビバイトは 2^30 バイトです。10 進のギガバイトは 1,000,000,000 なので、2 進のほうが 7.37 % 大きくなります。「1 ギガ」と言うときにあなたが思う量と、プログラムが解釈する量の差もこれと同じです。4 TB3,64 TiB接頭辞が大きくなるほど 2 つの体系は離れていきます。キロで 2.34 %、ギガで 6.87 %、テラで 9.05 % です。「ディスクが小さい」と感じる度合いが大容量ほど強くなるのはこのためです。100 Mbit12,5 MBネットワーク回線はビット、ストレージはバイトで測ります。1 バイトは 8 ビットなので、100 Mbit/s の回線でも 1 秒あたり最大 12.5 MB しかダウンロードできません。この計算だけでプロバイダーへの苦情の半分は説明がつきます。ユースケース
- 1 TB のディスクや 64 GB の USB メモリーが、パッケージの表記より少ない容量で表示される理由を理解する。
- API やログ、ls -l コマンドが返すバイト数を読みやすい単位に直す。
- 異なる物差しで測る 2 つのツールの間で、バックアップやイメージのサイズを比較する。
- ドキュメントは MiB、画面は MB という状況で、クォータやボリューム、アップロード上限を見積もる。
- 回線速度 Mbit/s を実際のダウンロード速度 MB/s に換算する。
- 購入したディスクの容量が約束より少ないわけではないことを、数字で顧客に説明する。
よくある質問
1 TB のディスクを買ったのに 931 GB しかありません。だまされたのでしょうか?
いいえ。ディスクには 1,000,000,000,000 バイトがあり、すべてのメーカーが使う 10 進法ではそれがまさに 1 TB です。Windows は同じバイト数を 1024 で 3 回割って 931.32 を得たうえで、その結果に「GiB」ではなく「GB」というラベルを付けます。容量ではなく表記の問題で、バイトはすべてそこにあります。本当に減るのはこれとは別の話で、フォーマット時にファイルシステムが確保する領域です。
GB と GiB の違いは何ですか?
1 GB は 1,000,000,000 バイト(10^9)、1 GiB は 1,073,741,824 バイト(2^30)です。ギビバイトのほうが 7.37 % 大きくなります。同じ関係が各段階で繰り返されます。kB と KiB、MB と MiB、TB と TiB です。2 進の記号は中央に「i」が入り、キビ、メビ、ギビ、テビと読みます。
どの OS も同じ数値を表示しますか?
いいえ、そこが混乱のもとです。Windows は 1024 の累乗で計算しながら GB や TB と表記するため、1 TB のディスクを 931 GB と表示します。macOS は 2009 年から 10 進で計算するので、同じディスクが 1 TB と表示されます。Linux はツール次第で、df -h と ls -lh は 1024、df -H と ls -l --si は 1000 を使い、多くのユーティリティーは必要に応じてすでに GiB と書きます。ディスクは何も変わっていません。変わるのは測る側です。
メモリー(RAM)が箱の表記と一致するのはなぜですか?
メモリーは 2 の累乗で製造・アドレス指定されるからです。「16 GB」のモジュールは実際には 16 GiB、つまり 17,179,869,184 バイトです。OS も 2 進で数えるので両者の数字が一致し、誰も違いに気づきません。ディスクではその逆で、メーカーは 10 進、OS は 2 進で数えるため、差がはっきり見えてしまいます。
接頭辞によって差はどれくらい広がりますか?
1 段階ごとに 2.4 % ずつ積み重なります。OS が表示する数字は、キロで 2.34 %、メガで 4.63 %、ギガで 6.87 %、テラで 9.05 %、ペタで 11.18 %、エクサで 13.26 % 小さくなります。数 kB のファイルでは気づかない差でも、数ペタバイトのアレイでは数百テラバイト分の期待の差になります。
Mbit と MB は同じものですか?
いいえ、8 倍の差があります。ネットワーク回線はビット毎秒、ストレージはバイトで測り、1 バイトは 8 ビットです。300 Mbit/s の回線でもダウンロードは最大 37.5 MB/s で、しかもこれはプロトコルのヘッダーを差し引く前の値です。さらにネットワークの接頭辞は常に 10 進で、1 Mbit は 100 万ビットであり、1,048,576 ではありません。
SSD の空き容量がさらに少ないのはなぜですか?
10 進と 2 進の差に、さらに 2 つの要素が加わります。1 つ目はオーバープロビジョニングで、コントローラーが使用できない領域としてフラッシュメモリーの一部を確保し、劣化したブロックの置き換えや書き込みの高速化に使います。2 つ目はファイルシステムで、フォーマットした時点でテーブル、ジャーナル、メタデータに容量を使います。どちらも不具合ではなく、ドライブが長く正しく動くための代価です。
では、ドキュメントにはどの単位を使うべきでしょうか?
誤解の余地がない単位です。値を 1024 の累乗で計算しているなら MiB や GiB、1000 の累乗で計算しているなら MB や GB と書きます。API や設定ファイルでは、バイト数をそのまま公開し、表示方法は画面側に任せるのがもっとも安全です。たった 1 行のコードで、同じファイルなのに 2 つのツールが違う数値を出す理由をめぐる何時間もの議論を防げます。