web-dev-qa-db-ja.com

"Size"と "Size on disk"の間にそれほど大きな違いがあるのはなぜですか?

以下でわかるように、私のフォルダのサイズディスクのサイズフィールドには大きな違いがあります。何故ですか?

Screenshot showing 50,875 files in 1,504 folders, 105 MB being 1.43 GB on disk

私は、ディスク上のサイズサイズより少し大きいべきだと知っています。差?ファイル数が多いからでしょうか。

ところで、このフォルダは私のAndroid携帯のSDカードにあります。この中に、私の地図アプリはキャッシュされた地図を保存し、アプリはGoogle Mapsから地図を取得します。

300
vfsoraki

私はあなたがこれがSDカードであると述べているので、あなたがここでFAT/FAT32ファイルシステムを使用していると仮定するでしょう。 NTFSとexFATは、割り当て単位に関して同様に動作します。他のファイルシステムは異なるかもしれませんが、とにかくWindowsではサポートされていません。

あなたが小さなファイルをたくさん持っているなら、これは確かに可能です。このことを考慮:

  • 50,000ファイル.

  • 32 kBのクラスタサイズ(アロケーションユニット)。これはFAT32の最大値です。

さて、今、最小スペースは50,000 * 32,000 = 1.6 GBです(数学を簡単にするために、バイナリではなくSIプレフィックスを使用)。各ファイルがディスク上で占有するスペースは、常にアロケーションユニットサイズの倍数です。ここでは、各ファイルが実際には1ユニットに収まるほど十分に小さいと仮定しています。

各ファイルの平均サイズが2 KBの場合、合計で約100 MBの容量になります。ただし、割り当て単位のサイズにより、平均で15倍(ファイルあたり30 KB)も無駄になります。


詳細な説明

なぜこれが起こるのですか? FAT32ファイルシステムでは、各ファイルがどこに格納されているかを追跡する必要があります。 1バイトごとのリストを保持するのであれば、テーブル(アドレス帳のように)はデータと同じ速度で成長し、多くのスペースを無駄にします。それで彼らがすることは「クラスターサイズ」としても知られている「アロケーションユニット」を使うことです。ボリュームはこれらの割り当て単位に分割され、ファイルシステムに関する限り、それらを細分化することはできません - それらはそれがアドレスできる最小ブロックです。あなたが家の番号を持っているのと同じように、しかしあなたの郵便配達員はあなたが何人の寝室を持っているか、あるいは誰がそれらに住んでいるかを気にしません。

それで、あなたが非常に小さいファイルを持っているとどうなりますか?ファイルシステムは、ファイルが0 KB、2 KB、15 KBのどれであっても構いません。上記の例では32 KBです。あなたのファイルはほんの少しのスペースを使用しており、残りは基本的に無駄になっていますが、それでもファイルに属しています。

なぜ配分単位サイズが異なるのですか?まあ、それはより大きなテーブル(アドレス帳、例えば、Johnが123 Fake Street、124 Fake Street、666 Satan Laneなどに家を所有していると言うこと)、またはそれ以上の無駄なスペース(家)を持つことのトレードオフになります。より大きなファイルがある場合は、より大きなアロケーションユニットを使用する方が理にかなっています - 他のすべてのファイルがいっぱいになるまでファイルは新しいユニット(家)を取得しないためです。小さなファイルがたくさんある場合は、とにかく大きなテーブル(アドレス帳)があるので、小さな単位(家)を用意してください。

大きなアロケーションユニットは、原則として、たくさんの小さなファイルがあると多くのスペースを無駄にします。一般的な用途で4 kBを超えるのには通常、良い理由はありません。


断片化

断片化に関しては、断片化はこの方法でスペースを無駄にするべきではありません。大きなファイルは複数のアロケーションユニットに分割、分割されることがありますが、各ユニットは次のユニットが開始される前にいっぱいにされるべきです。デフラグはアロケーションテーブルのスペースを少し節約するかもしれませんが、これはあなたの特定の問題ではありません。


可能な解決策

gladiator2345が示唆しているように 、この時点での唯一の現実的な選択肢は、それをそのまま使用するか、より小さな割り当て単位で再フォーマットすることです。

お使いのカードはFAT16でフォーマットされているかもしれません。これはテーブルサイズの制限がより小さく、したがってより大きなボリュームに対応するためにもっと大きな割り当て単位を必要とします(32 KBの割り当て単位で上限2 GB)。 出典Braiam の好意により。その場合は、とにかくFAT32として安全にフォーマットできるはずです。

300
Bob

これは、1つのファイルに圧縮/アーカイブするのが役に立つかもしれない状況の1つです。 Bobが彼の答えで言ったこと は正しい が、他の答えが示すようにディスクを再フォーマットするよりも解決策のほうが簡単かもしれない。 (Zip、tar、その他の方法を使用して)ディレクトリを圧縮またはアーカイブすると、ファイルシステムには、いくつかの小さなファイルではなく、単一の大きなファイルがあることがわかります。圧縮しなくても、およそ1.4 GiBのスペースが戻ってきます。これらの「小さなファイル」はすべて1つの大きなファイルとしてカウントされるためです。

この中に、私の地図アプリはキャッシュされた地図を保存し、アプリはGoogle Mapsから地図を取得します。

たぶん、あなたは開発者と話し合い、複数のファイルの代わりにアーカイブやデータベースを使うべきです。これはおそらくディスクの断片化を少なくし、特にNAND型フラッシュドライブの場合は確実にスペースを節約するのに役立ちます。 100MBのペイロード/有用なデータが1.4GiBになるというばかげた状況を説明すると、データの保存方法に問題があるため、開発者はより良いソリューションを提供する必要があります。

46
Braiam

誰かがこの問題に直面している場合、ディスク上のファイルサイズ/スペースの大きな違いを見るもう一つの理由は、 代替データストリーム (ADS)の使用であることも知っておくと便利です。

これは私の知る限りではNTFSにのみ当てはまります。 ADSは、正当な用途と正当ではない用途の両方で知られています。

  • インターネットからダウンロードしたファイルにタグを付ける
  • メタデータを保存する(マイクロソフトは、ファイルの種類を判別するためにファイル拡張子を使用しないなど、Apple OSの機能の一部を組み込みたいと考えていた)
  • マルウェアのコンテキストでデータまたはコードを隠す

単純にADS:NTFSファイルは複数のデータストリームを保持できます(「サブファイル」を理解してください)。 1つは、Windows Explorerや他のWindowsツールで使用されているメインストリームで、ファイルの通常の内容を保持しています。代替データストリームには、メインストリームとまったく同じように他の情報が含まれている場合がありますが、Windowsツールで直接処理することはできません(特にExplorerでは、ADSのサイズに関係なくメインストリームのサイズと同じファイルサイズを表示) ADSの作成、読み取り、および検索には、専用のツールまたはコードを使用する必要があります。

主なポイントは、大きなファイルサイズの違いが観察された場合、ADSの可能性を見逃してはいけないということ、そしてマルウェアを隠しているということです。

他のリンク

安全にADSを試すには、DOS/CMDレベルで試してください。

Cのルートにファイルの内容を作成して表示します。

C:\> echo The main data stream> test.txt
C:\> type test.txt

結果:

C:\> The main data stream

同じ方法でADSを追加し、ファイル名に加えてADS名を指定します。

C:\> echo The secret message> test.txt:secret

秘密のメッセージをファイルに隠しました。 Explorerのファイルサイズは、ADSの "secret"にバイトを追加しても変わりません。

ADSの内容を表示してみます。

C:\> type test.txt:secret

結果:

The filename, directory name, or volume label syntax is incorrect.

CMD typeは、ADSの内容を表示できません。代わりにメモ帳を使用します。

notepad test.txt:secret

メモ帳では、ADSの内容を確認できます。

The secret message

完全な実行可能ファイルを無実のテキストファイルのADSに隠して、いつでも実行することもできます。富はハッカーに害を及ぼしません:-)

25
mins

問題は、クラスタサイズが原因である可能性があります。

Microsoftによると Microsoft

ボリュームに含まれているファイルまたはフォルダにNTFS圧縮を使用していない場合、SIZEとSIZE ON DISKの違いは、必要以上に大きいクラスタサイズのためにスペースが無駄に消費されることです。 SIZE ON DISK値がSIZE値にできるだけ近くなるように、最適なクラスタサイズを使用するようにしてください。 SIZE ON DISKとSIZE値の間に過度の矛盾があるということは、デフォルトのクラスターサイズが、ボリュームに格納している平均ファイルサイズに対して大きすぎることを示しています。これを行うには、ボリュームをバックアップし、formatコマンドと/ aスイッチを使用して適切な割り当てサイズを指定してボリュームを再フォーマットします。IE:format D: /a:2048(この例では2 KBのクラスターサイズを使用します)。

ドライブをより小さなクラスタサイズでフォーマットしてみてください。

19
arundevma

私は多くの人々があなたのドライブをより小さなクラスタサイズで再フォーマットすることを勧めているのを見ます。これはSDカードなので、NANDのクラスタサイズのサイズに合わせてカードを推奨クラスタサイズに事前フォーマットすることに注意してください(両方を同期させるとvery最適な読み取り/書き込みパフォーマンスと消耗の低減のために重要です。

あなたはNANDのクラスタサイズを変更することはできません(それはあなたのSDカードのハードウェアの物理的属性です)。

SDカードで最初にscandisk/chkdskを実行して、サイズレポートの問題が破損したファイルシステム内にないことを確認します。

次に、バグをGoogle Mapの開発者に報告してください。彼らは優れた保管方法を使用するべきです。それを修正すると、I/Oやファイルシステムのドライバアクティビティが減るため、多くのデバイスでアプリの実行速度が向上するはずです。

9

これは多くのファイルシステムの一般的な問題です。ここで働く2つの要因があります。ファイルシステムが論理ボリュームごとに扱うことができる「ブロック」の最大数と記憶媒体の物理的な制限です。特定のブロックに割り当てることができるファイルは1つだけです(ファイルは通常、必要な数のブロックを必要とします)。そのため、64バイトのテキストファイルは、それが存在するファイルシステムのブロックサイズにもよりますが、4Kから32Kの間で何でもかまいません。

これについて考える1つの方法は、ファイルシステム内の各ブロックをボックスとして、ファイルシステムを部屋として考えることです。あなたの箱はすべて同じサイズです、そしてあなたは部屋の中であなたができる限り多くに合うようにします。あなたがそれらをすべて残されたより多くの部屋と一緒に収めるならば、部屋が箱で完全に満たされるようにあなたはより大きな箱を手に入れなければなりません。

箱に物を入れるための規則の1つは、箱に2つの無関係な物を入れることができないということです。それらは同じ文書の一部でなければなりません。それで、私がテキストのページをタイプアップするならば、それはそれ自身のボックスを持つでしょう。入力したテキストのページ数が非常に多くて1つのボックスに収まりきらない場合は、別のボックスを見つけて代わりにそこにページを挿入し、すべてのページをファイルするまで繰り返します。その文書に使用した箱と、それを順番に読む箱の順序も書き留めておいたほうがいいでしょう。

ボックスの整理方法によっては、マニフェストに特定の数のボックス用のスペースしかない場合があります。それで私がいっぱいにするための大きな部屋を持っていたけれども、私が部屋の容量に達するために非常に大きな箱を使わなければならない箱の数が少ないならば。

それで、その場合私の1ページの文書はまだそれを共有している何もなしで単一の箱を占めるでしょう。

同じ状況が、さまざまなストレージソリューションでも見られます。 FAT32は今日の巨大なハードドライブで少数の「箱」と見なされるものしか管理できないので、これを補うために非常に大きい「箱」ができあがります。

7
CyberSkull

あなたはウィキペディアのBlock Suballocationエントリーを見てください。それがまさにあなたに起こっていることです。 Tail Packagingをサポートするファイルシステムを使用することは、割り当てクラスタサイズを変更すること以外に、この問題に対するファイルシステムレベルの解決策です。

いずれもディスクを再フォーマットする必要があるという不都合があります。

場合によっては、単にそれらのファイルをアーカイブに保存するだけで問題が解決します(そしてファイルの終わりでスペースを失うのを止めるのとは別に小さなファイルも圧縮されます)。これは、解凍のためにいくらかの時間を費やすという不都合を有する。

特定のアプリケーション関連の問題のために非常に多くの小さなファイルがある場合の別のオプションは、別の方法を使用してソフトウェアデータを保存することです(データベースにある場合があります)。しかし、もちろんエンドユーザーではなく、プログラマーのためのソリューションです。

http://ja.wikipedia.org/wiki/Tail_packing

6
kriss

クラスタサイズとは別に、次の条件により矛盾が生じる可能性もあります。

  • 圧縮ファイルまたは暗号化ファイルは、論理ファイルサイズとは異なる容量を消費する可能性があります。
  • リンクされたファイルはn×リンク数×論理ファイルサイズのファイルサイズを報告しますが、通常は使用される物理スペースは少なくなります。
6

Windows 10では個々のファイルでファイルサイズが大きく異なることに気付きましたが、同じ場所(ネットワークドライブ)からSAMEファイルのプロパティを見ると、Windows XPでは大きな違いはありません。ほんの少しの違い、それはあなたが期待することです。私は、Windows 10にバグがあると思います。449MBのファイルは、おそらく3.99GBを占有しません。これは、Windows 10が言っていることです。

0
David Hutchins