「サイズ」と「ディスク上のサイズ」に大きな違いがあるのはなぜですか?


302

あなたは以下を参照することができますように、とのそんなに違いがあるのサイズディスク上のサイズ私のフォルダ内のフィールドは。何故ですか?

1,504個のフォルダー内の50,875個のファイルを示すスクリーンショット、105 MBはディスク上で1.43 GB

私は知っているディスク上のサイズがより少しでなければなりませんサイズのWindowsであるためアロケーションユニットで、その差の理由はそれだけ?多数のファイルが原因である可能性がありますか?

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


10
こんにちはthelastblack、SuperUserへようこそ。既存の2つの回答はディスクの不一致のサイズ/サイズに焦点を当てており、投稿された各質問が1つのことに関する場合にStack Exchange形式が最適に機能するため、質問を編集してデフラグに関する部分を削除しました。ただし、この質問に関してこれまでに受け取った回答は、最適化が役に立たないことを示していると思いますが、確かにそれを別の質問として再質問できます。(通常、ソリッドステートメディアではうまくいきません。)何らかの方法で意図を変更したと感じた場合は、質問を自由に編集してください。
CVn 14年

1
@MichaelKjörlingHeh、私は断片化に関するマイナーな議論で編集しました(少し気が散りました)
ボブ14年

21
@MichaelKjörling 回答に合うように質問をさかのぼって編集しないでください。回答の1つは、OPの質問の断片化の部分に対応しています。混乱を避けるため、編集をロールバックする必要があります。
DanteTheEgregore

5
@DanteTheEgregoreフラグメンテーションの影響についても議論するために実際に編集されたボブの回答を参照している場合は、銃をジャンプする前に、その回答と質問の編集履歴とタイムスタンプを確認してください。私が編集した時点では、ボブの答えは断片化の問題をまったくカバーしていませんでした。OPがそのようにしたい場合、「メディアの最適化はこれで助けになりますか?」に戻って編集します。未解決の混乱を解決する必要がありますが、それでも別の質問として質問した方が良いと感じています。IMO 2つの値の違いの問題は無関係です。
CVn 14年

11
このアプリはひどく不適切にプログラムされているように思えます-バグレポートを提出することを検討してください。私は決してプロのプログラマーではありませんが、JavaMEで似たようなものをハッキングしたことがあります。もちろん、解決しなければならなかった問題の1つは、これらすべての小さなマップタイルを効率的にコンテナーに格納する方法(ストレージとアクセス)でした。最終的には非圧縮のzipファイルを使用しました。
A.ドンダ14年

回答:


303

ここではFAT / FAT32ファイルシステムを使用していると仮定します。これはSDカードであると言及しているためです。NTFSとexFATは、割り当てユニットに関して同様に動作します。他のファイルシステムは異なる場合がありますが、いずれにしてもWindowsではサポートされていません。

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

  • 50,000個のファイル。

  • 32 kBクラスターサイズ(割り当て単位)、FAT32の最大値

わかりました。現在、必要な最小スペースは50,000 * 32,000 = 1.6 GBです(数学を単純化するために、バイナリではなくSIプレフィックスを使用)。各ファイルがディスク上で占有するスペースは、常にアロケーションユニットサイズの倍数です。ここでは、各ファイルが実際には十分に小さく、いくつかの(無駄な)スペースが残っていると仮定しています。

各ファイルの平均が2 kBの場合、合計で約100 MBになりますが、アロケーションユニットサイズのために平均でその15倍(ファイルあたり30 kB)も無駄にしています。


詳細な説明

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

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

アロケーションユニットのサイズが異なるのはなぜですか?まあ、それは大きなテーブル(アドレス帳、例えば、ジョンが123フェイクストリート、124フェイクストリート、666サタンレーンなどに家を持っていると言うこと)、または各ユニット(家)での無駄なスペースのトレードオフになります。ファイルが大きい場合は、他のすべてがいっぱいになるまでファイルは新しいユニット(家)を取得しないため、大きな割り当てユニットを使用する方が理にかなっています。小さなファイルがたくさんある場合は、とにかく大きなテーブル(アドレス帳)を用意するので、小さな単位(家)を割り当てることもできます。

一般に、大きな割り当て単位は、小さなファイルがたくさんある場合、多くのスペースを無駄にします。通常、一般的な使用のために4 kBを超える理由はありません。


フラグメンテーション?

断片化に関しては、断片化はこの方法でスペースを浪費するべきではありません。大きなファイルは複数の割り当てユニットに分割、つまり分割される場合がありますが、各ユニットは次のユニットが開始される前にいっぱいにする必要があります。デフラグにより​​、割り当てテーブルのスペースが少し節約される場合がありますが、これは特定の問題ではありません。


可能な解決策

以下のようgladiator2345が示唆され、この時点で、あなたの唯一の本当の選択肢はそれと一緒に暮らすか小さい割り当て単位で再フォーマットすることです。

カードはFAT16でフォーマットされている可能性があります。これはテーブルサイズの制限が小さいため、より大きなボリュームに対応するためにはるかに大きなアロケーションユニットが必要です(32 kBアロケーションユニットで2 GBの上限)。ソースBraiamの好意による。その場合は、とにかくFAT32として安全にフォーマットできるはずです。


3
あなたはのでによる最小割り当てサイズに無駄なスペースが実際に技術的に、「内部断片化」と呼ばれている可能性が断片化が犯人であると言います。しかし、それはまだ「デフラグ」ツールが何でもできることではありません。
ホッブズ14年

3
(厳密には、「スラック」と呼ばれます。)
ホッブズ14年

1
クラスターサイズは、最大ファイルシステムサイズも制限します。たとえば、アドレス空間が32ビットの場合、合計で約42億9千万の可能なクラスターがあります。現在、NTFSでサポートされている最小のクラスターサイズ(512バイト)を使用する場合、最大512 * 2 ^ 32バイト= 2 GiBをアドレス指定できます。2 GiBを超えるデータを格納できるボリュームが必要な場合は、クラスターサイズを増やす必要があります。これは、保存しようとする実際の最大ファイルとはまったく関係ありません。問題が最も少ない2 GiBを超えるファイルを保存することはできません。
アンドンM.コールマン14年

4 KiBクラスターを使用すると、サイズが最大16 TiBのボリューム内のファイルをアドレス指定できます。これは、予見可能な将来に十分なサイズです。
アンドンM.コールマン14年

1
まあ、彼は小さなファイルのアーカイブを1つの大きなファイルに圧縮できます。
アインポクルム

45

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

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

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


1
>この中に、私のマップアプリはキャッシュされたマップを保存し、アプリはGoogleマップからマップを取得します。-残念ながら、この場合、圧縮(事実上、ベースシステムよりも上位のファイルシステム)には、このマッピングアプリのサポートが必要になります。
ボブ14年

1
そしてべきソリューションは、開発者側Dから来て@Bob:
Braiam

4
それは全く本当です。とりあえず、アプリを変更する必要があります。
vfsoraki 14年

17
@Braiamファイルシステムがだまされて、1つのファイルしかないと思われるわけではありません。そこにある唯一のファイルが。開発者がキャッシュ情報をアーカイブに保存しない理由については、ほとんどのアーカイブ形式が高速のランダム書き込み用に設計されていないためであり、キャッシュは確かに必要です。より良い代替手段は、SQLiteのような軽量のデータベースライブラリを使用することです。
bcrist 14年

1
絶対に真実..... +1
arundevma 14年

25

誰かがこの問題に直面している場合、ディスク上のファイルサイズ/スペースの大きな違いを見る別の理由が代替データストリーム(ADS)の使用であることを知ることも役に立つかもしれません

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

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

ADS単純:NTFSファイルは複数のデータストリームを保持できます(「サブファイル」を理解してください)。1つは、Windowsエクスプローラーおよびその他のWindowsツールで使用されるメインストリームであり、ファイルの通常のコンテンツを保持します。代替データストリームには、メインストリームとまったく同じ他の情報が含まれている場合がありますが、Windowsツールで直接処理することはできません(特に、エクスプローラーは、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

ファイル内の秘密のメッセージを非表示にしました。ADSの「秘密」にバイトを追加したにもかかわらず、エクスプローラーのファイルサイズは変更されていないことに注意してください。

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で完全な実行可能ファイルを非表示にして、いつでも実行できます。富はハッカーに害を与えません:-)


私は勝者ではありません。私の仕事はほとんどLinuxで行われています。これはとても役に立ちました。ありがとう
vfsoraki 14年

4
Sysinternalsの Streamsなどのツールを使用して、ADSの使用状況を確認する価値があります。たとえば、WindowsシステムにダウンロードされたファイルはADSのソースでタグ付けされる場合がありますが、これは非常に小さく、スペースをとるべきではありません。通常、dirまたはExplorerの出力には表示されません。ブロックを占有し、調査中のディスク使用量の問題を悪化させる可能性があります。。
アドリック14年

19

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

Microsoftによると:

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

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


4
つまり、クラスターサイズを4096バイト未満にしたり、この数の倍数にしたりしないでください。32ビットOSは、(非PAEの場合)4096バイトのページで動作するため、複数でないクラスターを使用すると、ファイルシステムのパフォーマンスに悪影響を与える可能性があります。これが、デフォルトサイズが4096バイトに設定されている理由です。
ルスラン14年

2
@Ruslanが言ったことに付け加えると、新しいハードドライブのセクターサイズは4 kBになりました。ファイルシステムを物理セクターに合わせ、物理セクターサイズの倍数をアロケーションユニットサイズにすることが最適です。
ボブ14年

1
@Ruslan 4096の2のべき乗であるべきだと言っていると思います。12288(3×4096)と20480(5×4096)は素晴らしい選択ではありません。
スコット14年

9

多くの人が、より小さなクラスターサイズでドライブを再フォーマットすることを推奨しているようです。これはSDカードであるため、多くのベンダーがNANDのクラスターサイズのサイズに一致するように推奨クラスターサイズにカードを事前にフォーマットしていることに注意してください(最適な読み取り/書き込みパフォーマンスと磨耗を減らすには、両方を同期させることが非常に重要です)

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

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

次に、バグをGoogleマップの開発者に報告することをお勧めします。開発者はここで責任を負います。優れた保管方法を使用する必要があります。これを修正すると、I / Oとファイルシステムのドライバーアクティビティが少なくなるため、多くのデバイスでアプリの実行が高速になります。


実際、それはGoogleマップではなく、Googleのマップを使用する別のアプリでした。開発者に通知し、SDからこれらのファイルを削除しました。
vfsoraki 14年

7

これは多くのファイルシステムの一般的な問題です。ここでは、2つの要因があります。1つのファイルシステムが論理ボリュームごとに処理できる「ブロック」の最大数と、記憶媒体の物理的な制限です。特定のブロックに割り当てることができるファイルは1つだけです(ファイルは通常、必要な数のブロックを使用します)。したがって、64バイトのテキストファイルは、常駐するファイルシステムのブロックサイズに応じて、4kから32kの範囲で使用できます。

これについて考える1つの方法は、ファイルシステム内の各ブロックをボックスとして、ファイルシステムを部屋として考えることです。あなたの箱はすべて同じサイズで、部屋にできるだけ多く収まるようにします。より多くのスペースを残してそれらをすべて合わせる場合、部屋が完全にボックスで満たされるように、より大きなボックスを取得する必要があります。

物を箱に入れるためのルールの1つは、箱に2つの無関係な物を入れることはできないということです。それらは同じドキュメントの一部でなければなりません。したがって、テキストのページを入力する場合、それは独自のボックスになります。入力したテキストに非常に多くのページがあり、すべてを1つのボックスに収めることができない場合、別のボックスを見つけて、代わりにそこにページを入れ続け、すべてのページを提出するまで繰り返します。また、そのドキュメントに使用したボックスと、それを順番に読み取るボックスの順序を書き留めていました。

ボックスの整理方法によっては、特定の数のボックスに対してマニフェストに十分なスペースしかありません。そのため、大きな部屋を埋めることができても、ボックスの数が少ない場合は、部屋の容量に達するために非常に大きなボックスを使用する必要があります。

したがって、その場合、私の1ページのドキュメントはまだ1つのボックスを占有し、それ以外は何も共有しません。

さまざまなストレージソリューション間で同じ状況が発生します。FAT32は、今日の巨大なハードドライブ上の少数の「ボックス」と考えられるもののみを管理できるため、これを補うために非常に大きな「ボックス」になります。


6

クラスタのサイズとは別に、次の条件のために不一致が生じる可能性があります。

  • 圧縮または暗号化されたファイルは、論理ファイルサイズとは異なるスペースを使用する可能性があります。
  • リンクされたファイルは、リンクの数に論理ファイルサイズのファイルサイズを掛けたn倍をレポートしますが、通常、使用される物理スペースは小さくなります。

一般的に、それは本当かもしれません。しかし、私の場合、高割り当てユニットが問題でした。
vfsoraki 14年

3
うん、私はちょうど矛盾のより多くの可能な理由を与えることによって答えに追加しようとしています。
アルキメデストラハノ14年

6

WikipediaのBlock Suballocationエントリをご覧ください。それがまさにあなたに起こっていることです。Tail Packagingをサポートするファイルシステムを使用することは、割り当てクラスターサイズの変更に加えて、この問題に対するファイルシステムレベルのソリューションです。

すべてのディスクを再フォーマットする必要があるという不便さがあります。

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

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

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


0

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


1
ちょうどFYI、質問はWindows 7を使用しているWindows 10 OPとは何の関係もありません
TheKB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.