Frage Warum gibt es einen so großen Unterschied zwischen "Size" und "Size on Disk"?


Wie Sie unten sehen können, gibt es so viele Unterschiede zwischen den Größe und Größe auf der Festplatte Felder in meinem Ordner. Warum das?

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

ich weiß das Größe auf der Festplatte sollte ein wenig mehr als sein Größe wegen der Zuordnungseinheiten in Windows, aber warum so viel Unterschied? Könnte es wegen der großen Anzahl von Dateien sein?

BTW, dieser Ordner ist auf der SD-Karte meines Android-Handys. Darin speichert meine Karten-App die zwischengespeicherten Karten und die App erhält ihre Karte von Google Maps.


295
2018-01-20 09:48


Ursprung


Hallo thelastblack, und willkommen bei SuperUser. Ich habe Ihre Frage bearbeitet, um den Teil zur Defragmentierung zu entfernen, da sich die beiden vorhandenen Antworten auf die Diskrepanz Größe / Größe auf dem Datenträger konzentrieren und das Stack Exchange-Format am besten funktioniert, wenn es sich bei jeder gestellten Frage um eine einzige Sache handelt. Sie können das natürlich als separate Frage erneut stellen, obwohl ich denke, dass die Antworten, die Sie bisher zu dieser Frage erhalten haben, zeigen, dass die Defragmentierung Ihnen nicht helfen wird. (Auf Festkörpermedien funktioniert das auch nicht.) Fühlen Sie sich frei bearbeiten Ihre Frage weiter, wenn Sie das Gefühl haben, dass ich Ihre Absicht in irgendeiner Weise geändert habe. - Michael Kjörling
@ MichaelKjörling Heh, ich habe gerade in einer kleinen Diskussion über Fragmentierung (wurde etwas abgelenkt) editiert - Bob
@MichaelKjörling Nicht Bearbeiten Sie Fragen rückwirkend, um sie den Antworten anzupassen. Eine der Antworten betrifft den fragmentierten Teil der OP-Frage. Ihre Bearbeitung muss zurückgesetzt werden, um Verwechslungen zu vermeiden. - DanteTheEgregore
@DanteTheEgregore Wenn Sie sich auf Bobs Antwort beziehen, die in der Tat bearbeitet wurde, um auch die Auswirkungen der Fragmentierung zu besprechen, dann überprüfen Sie bitte vor dem Überspringen der Waffe die Bearbeitungshistorien und Zeitstempel auf dieser Antwort und der Frage. Zum Zeitpunkt meiner Bearbeitung behandelte Bobs Antwort das Problem der Fragmentierung überhaupt nicht. Wenn das OP dies will, hilft mir die Bearbeitung von "Defragmentieren der Medien mir dabei?" sollte jede ausstehende Verwirrung lösen, obwohl ich noch fühle das ist besser als separate Frage gefragt; IMO die Frage der Unterschied zwischen den beiden Werten ist nicht verwandt. - Michael Kjörling
Sieht für mich so aus, als ob diese App schlecht programmiert ist - in Betracht ziehen, einen Fehlerbericht einzureichen. Ich bin kein professioneller Programmierer, aber ich habe in JavaME schon einmal etwas Ähnliches zusammengehackt, und natürlich musste ich eines der Probleme lösen, wie all diese kleinen Kartenkacheln (Speicher und Zugriff) in einem Container effizient gespeichert werden können. Ich habe am Ende unkomprimierte Zip-Dateien verwendet. - A. Donda


Antworten:


Ich nehme an, dass Sie hier das FAT / FAT32-Dateisystem verwenden, da Sie erwähnen, dass es sich um eine SD-Karte handelt. NTFS und exFAT verhalten sich in Bezug auf Zuordnungseinheiten ähnlich. Andere Dateisysteme sind möglicherweise anders, werden jedoch unter Windows nicht unterstützt.

Wenn Sie viele kleine Dateien haben, ist dies sicherlich möglich. Bedenken Sie:

  • 50.000 Dateien.

  • 32 KB Clustergröße (Zuordnungseinheiten), die für FAT32 maximal ist

Ok, jetzt die Minimum Der Platzbedarf beträgt 50.000 * 32.000 = 1.6 GB (mit SI-Präfixen, nicht binär, um die Mathematik zu vereinfachen). Der Platz, den jede Datei auf der Festplatte belegt, ist immer ein Vielfaches der Zuordnungseinheitsgröße - und hier gehen wir davon aus, dass jede Datei tatsächlich klein genug ist, um in eine einzelne Einheit zu passen, wobei noch (ungenutzter) Platz übrig bleibt.

Wenn jede Datei durchschnittlich 2 kB groß wäre, würden Sie ungefähr 100 MB Gesamtmenge erhalten - aber Sie verschwenden auch 15x das (30 kB pro Datei) im Durchschnitt aufgrund der Größe der Zuordnungseinheit.


Ausführliche Erklärung

Warum passiert das? Nun, das FAT32-Dateisystem muss verfolgen, wo jede Datei gespeichert ist. Wenn es eine Liste von jedem einzelnen Byte behalten würde, würde die Tabelle (wie ein Adressbuch) mit der gleichen Geschwindigkeit wie die Daten wachsen - und viel Platz verschwenden. Sie verwenden also "Zuordnungseinheiten", die auch als "Clustergröße" bezeichnet werden. Das Volumen ist in diese Zuordnungseinheiten unterteilt, und soweit das Dateisystem betroffen ist, können sie nicht unterteilt werden - das sind die kleinsten Blöcke, die adressiert werden können. Ähnlich wie Sie eine Hausnummer haben, aber Ihrem Postboten ist es egal, wie viele Schlafzimmer Sie haben oder wer in ihnen lebt.

Was passiert also, wenn Sie eine sehr kleine Datei haben? Nun, das Dateisystem kümmert sich nicht darum, ob die Datei 0 kB, 2 kB oder sogar 15 kB groß ist, es gibt ihm den geringsten Platz - im obigen Beispiel sind es 32 kB. Ihre Datei verwendet nur einen kleinen Teil dieses Speicherplatzes und der Rest ist im Grunde genommen verschwendet, gehört aber immer noch zur Datei - ähnlich wie ein Schlafzimmer, das Sie unbesetzt lassen.

Warum gibt es unterschiedliche Zuordnungseinheiten? Nun, es wird ein Kompromiss zwischen einem größeren Tisch (Adressbuch, zum Beispiel, dass John ein Haus in 123 Fake Street, 124 gefälschte Straße, 666 Satan Lane, usw. besitzt), oder mehr verschwendeten Platz in jeder Einheit (Haus). Wenn Sie größere Dateien haben, ist es sinnvoller, größere Zuordnungseinheiten zu verwenden - da eine Datei erst dann eine neue Einheit (Haus) bekommt, wenn alle anderen voll sind. Wenn Sie viele kleine Dateien haben, werden Sie sowieso einen großen Tisch (Adressbuch) haben, also können Sie ihnen auch kleine Einheiten (Häuser) geben.

Große Zuordnungseinheiten werden in der Regel viel Speicherplatz verschwenden, wenn Sie viele kleine Dateien haben. Es gibt normalerweise keinen guten Grund, über 4 kB für den allgemeinen Gebrauch zu gehen.


Zersplitterung?

Hinsichtlich der Fragmentierung sollte die Fragmentierung auf diese Weise keinen Platz verschwenden. Große Dateien können in mehrere Zuordnungseinheiten fragmentiert, d. H. Aufgeteilt, werden, aber jede Einheit sollte gefüllt sein, bevor die nächste gestartet wird. Defragging kann in den Zuordnungstabellen etwas Speicherplatz sparen, aber das ist nicht Ihr spezifisches Problem.


Mögliche Lösungen

Wie gladiator2345 vorgeschlagen, Ihre einzigen wirklichen Optionen an diesem Punkt sind, damit zu leben oder mit kleineren Zuordnungseinheiten neu zu formatieren.

Ihre Karte könnte in FAT16 formatiert sein, das eine kleinere Begrenzung für die Tabellengröße hat und daher viel größere Zuordnungseinheiten benötigt, um ein größeres Volumen zu adressieren (mit einer oberen Grenze von 2 GB mit 32 kB Zuordnungseinheiten). Quelle mit freundlicher Genehmigung von Braiam. Wenn dies der Fall ist, sollten Sie trotzdem in der Lage sein, als FAT32 sicher zu formatieren.


299
2018-01-20 09:54



Der verschwendete Platz aufgrund minimaler Zuteilungsgrößen wird technisch eigentlich als "interne Fragmentierung" bezeichnet, also Sie könnte sagen, dass die Fragmentierung der Schuldige ist. Aber es ist immer noch nichts, womit ein "Defragment" -Tool nichts anfangen kann. - hobbs
(Weniger technisch heißt es nur "locker".) - hobbs
Clustergrößen begrenzen auch die maximale Dateisystemgröße. Wenn Ihr Adressraum beispielsweise 32 Bit beträgt, haben Sie insgesamt etwa 4,29 Milliarden mögliche Gesamtcluster. Wenn Sie nun die kleinste Clustergröße verwenden, die von NTFS unterstützt wird (512 Byte), können Sie maximal 512 * 2 ^ 32 Byte = 2 GiB adressieren. Wenn Sie ein Volume benötigen, das mehr als 2 GiB Daten speichern kann, müssen Sie die Clustergröße erhöhen. Dies ist alles unabhängig von der tatsächlich größten Datei, die Sie speichern möchten, vorausgesetzt, Sie können keine Datei speichern, die größer als 2 GiB ist, was das kleinste Ihrer Probleme ist. - Andon M. Coleman
Mit 4 KiB-Clustern können Sie Dateien in einem Volumen von bis zu 16 TiB adressieren, was für die absehbare Zukunft ausreichen sollte. - Andon M. Coleman
Nun, er konnte sein Archiv kleiner Dateien in eine große Datei komprimieren. - einpoklum


Dies ist eine der Situationen, in denen das Komprimieren / Archivieren in eine einzige Datei hilfreich sein kann. Was Bob sagte in seiner Antwort ist wahr aber die Lösung ist möglicherweise einfacher als die Festplatte neu zu formatieren, wie andere Antworten vermuten lassen. Wenn Sie das Verzeichnis komprimieren oder archivieren (mit zip, tar oder einer anderen Methode), wird das Dateisystem sehen, dass Sie eine einzige große Datei haben, anstatt mehrere kleinere. Selbst ohne Komprimierung werden Sie fast 1,4 GiB Speicherplatz zurückbekommen, da all diese "kleinen Dateien" als eine einzige große Datei gezählt werden.

Darin speichert meine Karten-App die zwischengespeicherten Karten und die App erhält ihre Karte von Google Maps

Vielleicht sollten Sie mit dem Entwickler diskutieren, statt mehrerer Dateien ein Archiv oder eine Datenbank zu verwenden. Dies wird wahrscheinlich auch helfen, die Festplatte weniger fragmentiert zu haben und wird sicherlich Speicherplatz sparen, besonders wenn es ein NAND-Flash-Laufwerk ist. Wenn Sie die lächerliche Situation erklären, in der 100MB Nutzlast / Nutzdaten zu 1,4GiB werden, stimmt etwas nicht damit, wie die Daten gespeichert werden, und die Entwickler sollten eine bessere Lösung bringen.


46
2018-01-20 15:03



> Darin speichert meine Karten-App ihre im Cache gespeicherten Karten und die App erhält ihre Karte von Google Maps. - In diesem Fall würde die Komprimierung (bei der es sich effektiv um ein Dateisystem handelt, das über dem Basis-Dateisystem liegt) in diesem Fall Unterstützung von dieser Mapping-App erfordern. - Bob
@Bob dann sollte die Lösung von der Entwicklerseite D kommen: - Braiam
Das ist völlig richtig. Ich denke, vorläufig sollte ich meine App ändern. - vfsoraki
@Braiam Es trickst nicht das Dateisystem in der Annahme, dass es nur eine Datei gibt; Dort ist nur eine Datei. Warum die Entwickler die Cache-Informationen nicht in einem Archiv speichern, liegt wahrscheinlich daran, dass die meisten Archivformate nicht für schnelle zufällige Schreibvorgänge ausgelegt sind, die ein Cache sicherlich benötigt. Eine bessere Alternative könnte die Verwendung einer einfachen Datenbankbibliothek wie SQLite sein. - bcrist
Absolut wahr ..... +1 - arundevma


Falls jemand mit diesem Problem konfrontiert wird, könnte es nützlich sein, zu wissen, dass ein weiterer Grund, einen großen Unterschied in der Dateigröße / dem Speicherplatz auf der Festplatte zu sehen, die Verwendung von ist alternative Datenströme (ADS)

Dies gilt nur für NTFS nach meinem Wissen. ADS sind für legitime und nicht legitime Anwendungen bekannt:

  • eine Datei aus dem Internet herunterladen
  • Speichern von Metadaten (Microsoft wollte einige der Apple OS-Funktionen einbeziehen, z. B. die Dateierweiterung nicht verwenden, um den Dateityp zu bestimmen)
  • um Daten oder Code im Kontext einer Malware zu verstecken.

ADS einfach: jede NTFS-Datei kann mehrere Datenströme enthalten (verstehen Sie "Subdateien"). Einer davon ist der Hauptstrom, der von Windows Explorer und anderen Windows-Tools verwendet wird. Er enthält den üblichen Inhalt einer Datei. Alternative Datenströme können andere Informationen enthalten, genau wie der Hauptstrom, aber sie können nicht direkt von Windows-Tools verarbeitet werden (insbesondere zeigt Explorer die Dateigröße der Größe des Hauptstroms an, unabhängig von der Größe des ADS). Sie müssen spezielle Tools oder Code verwenden, um ADS zu schreiben, zu lesen und zu lokalisieren.

Der Hauptpunkt ist, dass bei großen Dateigrößenunterschieden die Möglichkeit von ADS und versteckter Malware nicht übersehen wird.

Ein weiterer Link.

Um sicher mit ADS zu experimentieren, versuchen Sie dies auf DOS / CMD-Ebene ...

Erstellen und zeigen Sie den Inhalt einer Datei im Stammverzeichnis von C an:

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

Ergebnis:

C:\> The main data stream

Fügen Sie nun ein ADS mit derselben Methode hinzu, geben Sie nur den ADS-Namen neben dem Dateinamen an:

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

Sie haben gerade die geheime Nachricht in der Datei versteckt. Beachten Sie, dass sich die Dateigröße im Explorer trotz Hinzufügen von Bytes im ADS "secret" nicht geändert hat.

Versuchen Sie, den ADS-Inhalt anzuzeigen:

C:\> type test.txt:secret

Ergebnis:

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

CMD type ist nicht in der Lage, den Inhalt des ADS anzuzeigen. Wir werden stattdessen Notepad verwenden:

notepad test.txt:secret

Im Editor können wir den Inhalt des ADS sehen:

The secret message

Sie können auch eine vollständige ausführbare Datei in einem ADS einer unschuldigen Textdatei ausblenden und sie jederzeit ausführen. Reichtum schadet Hackern nicht :-)


25
2018-01-21 07:37



Ich bin selbst kein Win-Mann, meine Arbeit wird meistens in Linux gemacht. Das war sehr nützlich. Vielen Dank - vfsoraki
Es lohnt sich, ein Tool wie Streams von zu verwenden Sysinternals um nach ADS-Nutzung zu suchen. Zum Beispiel können Dateien, die auf einem Windows-System heruntergeladen werden, mit einer Quelle in ADS versehen werden, obwohl dies winzig ist und keinen Platz beanspruchen sollte. Es wird normalerweise nicht im Verzeichnis oder im Explorer angezeigt. Es kann Blockaden verursachen und das Problem mit der Plattennutzung verschlimmern, das Sie untersuchen. . - adric


Das Problem liegt möglicherweise an der Clustergröße.

Gemäß Microsoft:

Wenn Sie keine NTFS-Komprimierung für Dateien oder Ordner verwenden   enthalten auf der Lautstärke, der Unterschied zwischen Größe und Größe auf der Festplatte   ist verschwendeter Speicherplatz wegen einer Clustergröße, die größer als erforderlich ist. Sie   sollte versuchen, eine optimale Clustergröße zu verwenden, so dass die Größe auf der Festplatte   Der Wert ist so nahe wie möglich am SIZE-Wert. Ein übermäßiges   Diskrepanz zwischen der SIZE ON DISK und dem SIZE Wert ist ein   Hinweis, dass die Standardclustergröße für den Durchschnitt zu groß ist   Dateigröße, die Sie auf dem Volume speichern, und das sollte es sein   verringert. Dies kann nur durch Sichern der Lautstärke und dann erfolgen   Neuformatierung des Volumes mit dem Befehl format und dem Schalter / a   um die geeignete Zuweisungsgröße anzugeben: IE: format D: /a:2048   (In diesem Beispiel wird eine Clustergröße von 2 KB verwendet.)

Versuchen Sie, das Laufwerk mit einer kleineren Clustergröße zu formatieren.


19
2018-01-20 09:57



Wie gesagt, man sollte keine Clustergröße von weniger als 4096 Bytes oder nur kein Vielfaches dieser Zahl machen. Ein 32-Bit-Betriebssystem arbeitet mit Seiten, die (im Nicht-PAE-Fall) 4096 Byte umfassen. Daher kann die Verwendung von nicht-multiplen Clustern die Dateisystemleistung beeinträchtigen. Aus diesem Grund ist die Standardgröße auf 4096 Byte eingestellt. - Ruslan
Um dem hinzuzufügen, was @Ruslan gesagt hat, haben neuere Festplatten jetzt eine Sektorgröße von 4 kB, und es wäre optimal, das Dateisystem auf die physischen Sektoren auszurichten und ein Vielfaches der physischen Sektorgröße als Zuordnungseinheitsgröße zu haben. - Bob
@ Ruslan Ich glaube, du meinst zu sagen, dass es eine Macht von zwei Mal 4096 sein sollte. 12288 (3 × 4096) und 20480 (5 × 4096) sind keine gute Wahl. - Scott


Ich sehe viele Leute, die empfehlen, Ihr Laufwerk mit einer kleineren Clustergröße neu zu formatieren. Da es sich um eine SD-Karte handelt, beachten Sie, dass viele Anbieter die Karte auf die empfohlene Clustergröße vorformatieren, um sie an die Größe der NAND-Clustergröße anzupassen (wobei beide synchron bleiben) sehr wichtig für optimale Lese- / Schreibleistung und Reduzierung des Verschleißes

Sie können die Clustergröße des NANDs nicht ändern (dies ist ein physikalisches Attribut der Hardware Ihrer SD-Karte).

Führen Sie zuerst scandisk / chkdsk auf Ihrer SD-Karte aus, um sicher zu sein, dass das Problem mit dem Größenbericht nicht in einem beschädigten Dateisystem liegt.

Zweitens würde ich vorschlagen, dass Sie den Fehler den Google Map-Entwicklern melden, da sie hier die Schuld tragen. Sie sollten eine überlegene Speichermethode verwenden. Durch die Fehlerbehebung sollte die App aufgrund der geringeren E / A- und Dateisystem-Treiberaktivität auf vielen Geräten schneller ausgeführt werden.


9
2018-01-21 18:20



Eigentlich war es nicht Google Maps, sondern eine andere App, die Googles Karten verwendet. Ich informierte den Entwickler und entfernte diese Dateien einfach von meinem SD. - vfsoraki


Dies ist ein generelles Problem bei vielen Dateisystemen. Dabei spielen zwei Faktoren eine Rolle: die maximale Anzahl von "Blöcken", die ein Dateisystem pro logischem Volumen bewältigen kann, und physikalische Einschränkungen des Speichermediums. Jedem gegebenen Block kann nur 1 Datei zugewiesen werden (Dateien nehmen normalerweise so viele Blöcke wie nötig). So kann eine Textdatei mit 64 Bytes oft von 4k bis 32k reichen, abhängig von der Blockgröße des Dateisystems, auf dem sie sich befindet.

Eine Möglichkeit, darüber nachzudenken, besteht darin, jeden Block im Dateisystem als eine Box und das Dateisystem als einen Raum zu betrachten. Alle Ihre Boxen haben die gleiche Größe, und Sie versuchen, so viele wie möglich in einem Raum zu passen. Wenn Sie alle mit mehr Platz füllen, müssen Sie größere Boxen bekommen, damit der Raum komplett mit Boxen gefüllt ist.

Eine der Regeln, um Dinge in Boxen zu setzen, ist, dass du zwei nicht verwandte Dinge nicht in eine Box legen kannst. Sie müssen Teil desselben Dokuments sein. Wenn ich also eine Textseite eingeben würde, hätte sie eine eigene Box. Wenn mein getippter Text so viele Seiten hätte, dass ich nicht alles in eine Box packen könnte, würde ich einfach eine andere Box finden und stattdessen stattdessen Seiten einfügen und wiederholen, bis ich alle meine Seiten abgelegt hätte. Ich hätte auch die Kästchen notiert, die ich für dieses Dokument verwendet habe, und die Reihenfolge der Kästchen, um es nacheinander zu lesen.

Je nachdem, wie ich die Boxen organisieren würde, hätte ich in meinem Manifest möglicherweise nur Platz für eine bestimmte Anzahl an Boxen. Wenn ich also einen großen Raum hätte, den ich füllen müsste, aber nur eine kleine Anzahl von Kästen, müsste ich sehr große Kästen benutzen, um die Raumkapazität zu erreichen.

In diesem Fall würde mein einseitiges Dokument immer noch eine einzige Box belegen, ohne dass es sonst geteilt wird.

Die gleichen Situationen spielen sich zwischen verschiedenen Speicherlösungen ab. FAT32 kann nur eine geringe Anzahl von "Boxen" auf den heutigen riesigen Festplatten verwalten, so dass es sehr große "Boxen" gibt, um dies auszugleichen.


7
2018-01-20 14:50





Neben den Clustergrößen können Sie aufgrund der folgenden Bedingungen auch eine Diskrepanz aufweisen:

  • Komprimierte oder verschlüsselte Dateien können einen anderen Speicherplatz als die logische Dateigröße belegen.
  • Verknüpfte Dateien werden gemeldet n Mal die Anzahl der Links multipliziert mit der Größe der Datei für die logische Dateigröße, aber der physische Speicherplatz ist normalerweise geringer.

6
2018-01-20 17:42



Im Allgemeinen könnte das wahr sein. Aber in meinem Fall war eine hohe Zuordnungseinheit das Problem. - vfsoraki
Ich versuche nur, die Antwort zu ergänzen, indem ich mehr mögliche Gründe für die Diskrepanz gebe. - Archimedes Trajano


Sie sollten sich den Eintrag Block Suballocation in Wikipedia ansehen. Das ist genau das, was dir passiert. Die Verwendung eines Dateisystems mit Unterstützung für Tail Packaging ist eine Lösung auf Dateisystemebene für dieses Problem neben der Änderung der Größe des Zuordnungsclusters.

Alle haben den Nachteil, dass sie die Festplatte neu formatieren müssen.

In einigen Fällen würde das bloße Speichern dieser Dateien in einem Archiv das Problem beheben (und die kleinen Dateien würden auch komprimiert werden, neben dem Platzverlust am Ende der Dateien zu stoppen). Dies hat den Nachteil, etwas Zeit für die Dekomprimierung aufzuwenden.

Eine andere Option, wenn Sie so viele kleine Dateien wegen eines spezifischen Problems mit der Anwendung haben, ist das Speichern Ihrer Softwaredaten mit einer anderen Methode (möglicherweise in einer Datenbank). Aber natürlich ist es eine Lösung für Programmierer, nicht Endnutzer.

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


6
2018-01-20 15:00





Ich habe große Dateigrößenunterschiede in Windows 10 in einer einzelnen Datei festgestellt, aber wenn ich mir die Eigenschaften der SAME-Datei vom selben Ort (ein Netzlaufwerk) anschaue, ist bei Windows XP die große Diskrepanz nicht vorhanden; nur ein kleiner Unterschied, was Sie erwarten würden. Ich denke, es gibt einen Fehler in Windows 10. Eine Datei mit 449 MB nimmt wahrscheinlich nicht 3,99 GB in Anspruch, was Windows 10 mir sagt.


0
2018-06-15 17:57



Nur ein FYI, die Frage hat nichts mit Windows 10 zu tun. OP verwendet Windows 7. - TheKB