Warum gibt es einen so großen Unterschied zwischen "Größe" und "Größe auf Festplatte"?

302

Wie Sie unten sehen können, gibt es einen großen Unterschied zwischen den Feldern Größe und Größe auf der Festplatte in meinem Ordner. Warum ist das so?

Screenshot mit 50.875 Dateien in 1.504 Ordnern, wobei 105 MB 1,43 GB auf der Festplatte sind

Ich weiß, dass die Größe auf der Festplatte aufgrund der Zuordnungseinheiten in Windows etwas größer sein sollte als die Größe , aber warum ist das ein großer Unterschied? Könnte es an der großen Anzahl von Dateien liegen?

Übrigens, dieser Ordner befindet sich auf der SD-Karte meines Android-Telefons. Darin speichert meine Karten-App die zwischengespeicherten Karten und die App bezieht ihre Karte von Google Maps.

vfsoraki
quelle
10
Hallo theLastBlack, und willkommen bei SuperUser. Ich habe Ihre Frage bearbeitet, um den Teil über die Defragmentierung zu entfernen, da sich die beiden vorhandenen Antworten auf die Größe / Größe der Diskrepanz konzentrieren und das Stack Exchange-Format am besten funktioniert, wenn es sich bei jeder gestellten Frage um eine einzelne Sache handelt. Sie können dies jedoch sicherlich als separate Frage erneut stellen, obwohl die Antworten, die Sie bisher zu dieser Frage erhalten haben, meines Erachtens zeigen, dass eine Defragmentierung Ihnen nicht helfen wird. (Bei Festkörpermedien ist dies im Allgemeinen auch nicht gut.) Sie können Ihre Frage jederzeit weiter bearbeiten , wenn Sie der Meinung sind, dass ich Ihre Absicht in irgendeiner Weise geändert habe.
einen Lebenslauf vom
1
@ MichaelKjörling Heh, ich habe gerade in einer kleinen Diskussion über Fragmentierung (etwas früher abgelenkt)
Bob
21
@ MichaelKjörling Sie nicht bearbeiten Fragen nachträglich Antworten passen. Eine der Antworten befasst sich mit dem Fragmentierungsteil der OP-Frage. Ihre Bearbeitung muss zurückgesetzt werden, um Verwirrung zu vermeiden.
DanteTheEgregore
5
@DanteTheEgregore Wenn Sie sich auf Bobs Antwort beziehen, die in der Tat bearbeitet wurde, um auch die Auswirkungen der Fragmentierung zu erörtern, überprüfen Sie vor dem Abspringen der Waffe die Bearbeitungshistorien und Zeitstempel dieser Antwort sowie die Frage. Zum Zeitpunkt meiner Bearbeitung deckte Bobs Antwort die Frage der Fragmentierung überhaupt nicht ab. Wenn das OP dies möchte, hilft mir die Bearbeitung in "Wird mir die Defragmentierung der Medien dabei helfen?" sollte alle ausstehenden Verwirrungen beseitigen, obwohl ich immer noch der Meinung bin, dass dies besser als separate Frage gestellt wird; IMO ist die Frage der Differenz zwischen den beiden Werten unabhängig.
ein Lebenslauf vom
11
Sieht für mich so aus, als ob diese App ernsthaft schlecht programmiert ist - überlegen Sie, ob Sie einen Fehlerbericht einreichen. Ich bin auf keinen Fall ein professioneller Programmierer, aber ich habe einmal etwas Ähnliches in JavaME gehackt, und eines der Probleme, die ich lösen musste, war natürlich, wie all diese kleinen Kartenkacheln effizient in einem Container gespeichert werden können (Speicherung und Zugriff). Am Ende habe ich unkomprimierte Zip-Dateien verwendet.
A. Donda

Antworten:

303

Ich gehe davon aus, 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 sowieso 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 beträgt der Mindestspeicherplatz 50.000 * 32.000 = 1,6 GB (zur Vereinfachung der Mathematik werden SI-Präfixe verwendet, keine Binärdateien). Der Speicherplatz, den jede Datei auf der Festplatte beansprucht, ist immer ein Vielfaches der Größe der Zuordnungseinheit - und hier gehen wir davon aus, dass jede Datei tatsächlich klein genug ist, um in eine einzelne Einheit zu passen, wobei etwas (verschwendeter) Speicherplatz übrig bleibt.

Wenn jede Datei durchschnittlich 2 KB groß ist, erhalten Sie insgesamt etwa 100 MB - aber Sie verschwenden auch durchschnittlich das 15-fache (30 KB pro Datei) aufgrund der Größe der Zuordnungseinheit.


Ausführliche Erklärung

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

Was passiert also, wenn Sie eine sehr kleine Datei haben? Nun, es ist dem Dateisystem egal, ob die Datei 0 kB, 2 kB oder sogar 15 kB groß ist. Im obigen Beispiel sind das 32 kB. Ihre Datei belegt nur einen kleinen Teil dieses Speicherplatzes, und der Rest wird im Grunde verschwendet, gehört aber immer noch zur Datei - ähnlich wie ein Schlafzimmer, das Sie unbewohnt lassen.

Warum gibt es unterschiedliche Zuordnungseinheitengrößen? Nun, es wird ein Kompromiss zwischen einem größeren Tisch (Adressbuch, z. B. John besitzt ein Haus in der 123 Fake Street, 124 Fake Street, 666 Satan Lane usw.) oder mehr verschwendetem 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) erhält, wenn alle anderen gefüllt sind. Wenn Sie viele kleine Dateien haben, haben Sie ohnehin einen großen Tisch (Adressbuch), also können Sie ihnen auch kleine Einheiten (Häuser) geben.

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


Zersplitterung?

Fragmentierung sollte auf diese Weise keinen Platz verschwenden. Große Dateien können fragmentiert, dh in mehrere Zuordnungseinheiten aufgeteilt werden, aber jede Einheit sollte gefüllt werden, bevor die nächste gestartet wird. Durch die Defragmentierung wird möglicherweise ein wenig Platz in den Zuordnungstabellen gespart, dies ist jedoch nicht Ihr spezielles Problem.


Mögliche Lösungen

Wie Gladiator2345 angedeutet hat , besteht Ihre einzige echte Option derzeit darin, damit zu leben oder mit kleineren Zuordnungseinheiten neu zu formatieren.

Ihre Karte ist möglicherweise in FAT16 formatiert, das eine geringere Beschränkung der Tabellengröße aufweist und daher viel größere Zuordnungseinheiten erfordert, um ein größeres Volumen zu adressieren (mit einer Obergrenze von 2 GB bei 32-kB-Zuordnungseinheiten). Quelle mit freundlicher Genehmigung von Braiam . Wenn dies der Fall ist, sollten Sie trotzdem sicher als FAT32 formatieren können.

Bob
quelle
3
Der verschwendete Speicherplatz aufgrund minimaler Zuordnungsgrößen wird technisch gesehen als "interne Fragmentierung" bezeichnet. Man kann also sagen, dass die Fragmentierung der Schuldige ist. Trotzdem kann kein "Defragmentierungs" -Werkzeug etwas dagegen tun.
Hobbs
3
(Weniger technisch, es heißt nur "locker".)
Hobbs
1
Clustergrößen begrenzen auch die maximale Dateisystemgröße. Wenn Ihr Adressraum beispielsweise 32-Bit ist, verfügen Sie über insgesamt ~ 4,29 Milliarden mögliche Cluster. Wenn Sie jetzt die kleinste von NTFS unterstützte Clustergröße (512 Byte) verwenden, können Sie maximal 512 * 2 ^ 32 Byte = 2 GB adressieren. Wenn Sie ein Volume benötigen, das mehr als 2 GB Daten speichern kann, müssen Sie die Clustergröße erhöhen. Dies ist alles unabhängig von der aktuell größten Datei, die Sie speichern möchten, vorausgesetzt, Sie können keine Datei mit mehr als 2 GB speichern, was das geringste Ihrer Probleme darstellt.
Andon M. Coleman
Mit 4 KiB-Clustern können Sie Dateien mit einem Volumen von bis zu 16 TiB adressieren, was auf absehbare Zeit ausreichen dürfte.
Andon M. Coleman
1
Nun, er könnte sein Archiv kleiner Dateien in eine große Datei komprimieren.
Einpoklum
45

Dies ist eine der Situationen, in denen das Komprimieren / Archivieren in eine einzelne Datei hilfreich sein kann. Was Bob in seiner Antwort sagte, ist wahr, aber die Lösung könnte einfacher sein, als die Festplatte zu reformieren, wie andere Antworten nahelegen. Wenn Sie das Verzeichnis komprimieren oder archivieren (mit zip, tar oder einer anderen Methode), sieht das Dateisystem, dass Sie eine einzige große Datei anstelle mehrerer kleinerer Dateien haben. Auch ohne Komprimierung erhalten Sie fast 1,4 GB Speicherplatz zurück, 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 bezieht ihre Karte von Google Maps

Vielleicht sollten Sie mit dem Entwickler besprechen, ob Sie ein Archiv oder eine Datenbank anstelle mehrerer Dateien verwenden möchten. Dies wird wahrscheinlich auch dazu beitragen, dass die Festplatte weniger fragmentiert ist, und wird sicherlich Platz sparen, insbesondere wenn es sich um ein NAND-Flash-Laufwerk handelt. Wenn Sie die lächerliche Situation erklären, in der aus 100 MB Nutzlast / Nutzdaten 1,4 GB werden, stimmt etwas nicht mit der Speicherung der Daten, und die Entwickler sollten eine bessere Lösung finden.

Braiam
quelle
1
> Darin speichert meine Karten-App die zwischengespeicherten Karten und die App bezieht ihre Karte von Google Maps. - Leider würde in diesem Fall die Komprimierung (die effektiv ein Dateisystem über dem Basis-Dateisystem ist) die Unterstützung dieser Mapping-App erfordern.
Bob
1
@ Bob dann sollte die Lösung von Entwicklerseite D kommen:
Braiam
4
Das stimmt völlig. Ich denke vorerst, ich sollte meine App ändern.
VFSORAKI
17
@Braiam Es täuscht das Dateisystem nicht vor, dass es nur eine Datei gibt. Es gibt nur eine Datei. Was den Grund betrifft, warum die Entwickler die Cache-Informationen nicht in einem Archiv speichern, liegt dies 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 schlanken Datenbankbibliothek wie SQLite sein.
bcrist
1
Absolut wahr ..... +1
Arundevma
25

Für den Fall, dass jemand mit diesem Problem konfrontiert wird, könnte es nützlich sein zu wissen, dass ein weiterer Grund für große Unterschiede in Dateigröße / Speicherplatz auf der Festplatte die Verwendung alternativer Datenströme (ADS) ist.

Dies gilt meines Wissens nur für NTFS. ADS sind sowohl für legitime als auch für nicht legitime Verwendungen bekannt:

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

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

Der wichtigste Punkt ist, dass Sie bei einem großen Unterschied in der Dateigröße die Möglichkeit von ADS und versteckter Malware nicht übersehen.

Ein weiterer Link .

Versuchen Sie dies auf DOS / CMD-Ebene, um sicher mit ADS zu experimentieren ...

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 mit der gleichen Methode einen ADS hinzu. Geben Sie lediglich den ADS-Namen und den 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 nicht geändert hat, obwohl wir dem ADS "secret" Bytes hinzugefügt haben.

Versuchen Sie, den ADS-Inhalt anzuzeigen:

C:\> type test.txt:secret

Ergebnis:

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

CMD typekann den Inhalt des ADS nicht anzeigen. 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 eine vollständige ausführbare Datei auch in einem ADS einer unschuldigen Textdatei verbergen und jederzeit ausführen. Reichtum schadet Hackern nicht :-)

Minuten
quelle
Ich bin selbst kein Win-Man, meine Arbeit wird hauptsächlich unter Linux ausgeführt. Das war sehr nützlich. Vielen Dank
vfsoraki
4
Es lohnt sich, ein Tool wie Streams von Sysinternals zu verwenden, um die Verwendung von ADS zu überprüfen. Beispielsweise können auf ein Windows-System heruntergeladene Dateien mit einer Quelle in ADS versehen werden, obwohl dies winzig ist und keinen Platz beanspruchen sollte. Es wird normalerweise nicht in der Ausgabe von dir oder Explorer angezeigt. Es kann Blöcke in Anspruch nehmen und das von Ihnen untersuchte Problem mit der Datenträgernutzung verschlimmern. .
Adric
19

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

Laut Microsoft :

Wenn Sie keine NTFS-Komprimierung für Dateien oder Ordner auf dem Volume verwenden, wird der Unterschied zwischen SIZE und SIZE ON DISK (Größe auf Datenträger) aufgrund einer Größe verschwendet, die über die erforderliche Clustergröße hinausgeht. Sie sollten versuchen, eine optimale Clustergröße zu verwenden, damit der Wert für SIZE ON DISK möglichst nahe am Wert für SIZE liegt. Eine übermäßige Diskrepanz zwischen SIZE ON DISK und SIZE ist ein Hinweis darauf, dass die Standardclustergröße für die durchschnittliche Dateigröße, die Sie auf dem Volume speichern, zu groß ist und verringert werden sollte. Dies kann nur durch Sichern des Volumes und anschließendes Neuformatieren des Volumes mithilfe des Befehls format und der Option / a erfolgen, um die entsprechende Zuordnungsgröße anzugeben: IE: format D: /a:2048 (In diesem Beispiel wird eine Clustergröße von 2 KB verwendet).

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

Arundevma
quelle
4
Allerdings sollte man die Clustergröße nicht unter 4096 Bytes oder nur nicht auf ein Vielfaches dieser Zahl reduzieren. Das 32-Bit-Betriebssystem arbeitet mit Seiten, die (in einem Nicht-PAE-Fall) 4096 Byte groß sind. Die Verwendung von nicht mehreren Clustern kann sich daher negativ auf die Leistung des Dateisystems auswirken. Aus diesem Grund ist die Standardgröße auf 4096 Byte festgelegt.
Ruslan
2
Neuere Festplatten haben jetzt eine Sektorgröße von 4 kB und es wäre optimal, das Dateisystem an den physischen Sektoren auszurichten und ein Vielfaches der physischen Sektorgröße als Größe der Zuordnungseinheit zu verwenden.
Bob
1
@ Ruslan Ich glaube, Sie wollen damit sagen, dass es eine Potenz von zweimal 4096 sein sollte. 12288 (3 × 4096) und 20480 (5 × 4096) sind keine gute Wahl.
Scott
9

Ich sehe viele Leute, die empfehlen, Ihr Laufwerk mit einer kleineren Clustergröße neu zu formatieren. Da dies eine SD - Karte ist zu beachten , dass viele Anbieter Vorformatierungsinformation die Karte auf die Größe empfohlen Cluster die Größe des NAND des Clustergröße anzupassen (beide synchron zu halten ist sehr wichtig für eine optimale Lese- / Schreibleistung und reduziert den Verschleiß-out)

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

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

Zweitens würde ich vorschlagen, dass Sie den Fehler Google Map-Entwicklern melden, die hier die Schuld tragen. Sie sollten eine überlegene Speichermethode verwenden. Das Beheben dieses Problems sollte auch dazu führen, dass die App auf vielen Geräten schneller ausgeführt wird, da weniger E / A- und Dateisystemtreiber aktiv sind.

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

Dies ist ein allgemeines Problem bei vielen Dateisystemen. Hierbei spielen zwei Faktoren eine Rolle: Die maximale Anzahl von "Blöcken", die ein Dateisystem pro logischem Volume verarbeiten kann, und die physischen Einschränkungen des Speichermediums. Jedem Block kann nur 1 Datei zugewiesen werden (Dateien nehmen im Allgemeinen so viele Blöcke auf, wie sie benötigen). So kann eine Textdatei mit 64 Bytes abhängig von der Blockgröße des Dateisystems, in dem sie sich befindet, häufig 4 KB bis 32 KB umfassen.

Eine Möglichkeit, dies zu betrachten, besteht darin, sich jeden Block im Dateisystem als Box und das Dateisystem als Raum vorzustellen. Alle Ihre Boxen haben die gleiche Größe und Sie versuchen, so viele wie möglich in einen Raum zu passen. Wenn Sie alle mit mehr Platz ausstatten, müssen Sie größere Kisten besorgen, damit der Raum vollständig mit Kisten gefüllt ist.

Eine der Regeln für das Einfügen von Dingen in Kisten ist, dass Sie nicht zwei unabhängige Dinge in eine Kiste einfügen können. Sie müssen Teil desselben Dokuments sein. Wenn ich also eine Textseite eintippen würde, hätte sie eine eigene Box. Wenn mein eingegebener Text so viele Seiten hätte, dass ich nicht alle in ein Feld passen könnte, würde ich einfach ein anderes Feld finden und stattdessen weiter Seiten darin einfügen und wiederholen, bis ich alle meine Seiten abgelegt hätte. Ich hätte auch die Kästchen aufgeschrieben, die ich für dieses Dokument verwendet hatte, und die Reihenfolge der Kästchen, in der sie nacheinander gelesen wurden.

Abhängig davon, wie ich die Boxen organisieren würde, habe ich in meinem Manifest möglicherweise nur genügend Platz für eine bestimmte Anzahl von Boxen. Wenn ich also einen großen Raum zu füllen hätte, aber nur eine kleine Anzahl von Kisten, müsste ich sehr große Kisten verwenden, um die Raumkapazität zu erreichen.

In diesem Fall würde mein einseitiges Dokument immer noch eine einzelne Box belegen, ohne dass etwas anderes es freigibt.

Die gleichen Situationen treten bei verschiedenen Speicherlösungen auf. FAT32 kann nur eine geringe Anzahl von "Boxen" auf den heutigen großen Festplatten verwalten, sodass es sehr große "Boxen" gibt, um dies auszugleichen.

CyberSkull
quelle
6

Abgesehen von Clustergrößen kann es aufgrund der folgenden Bedingungen auch zu Abweichungen kommen:

  • Komprimierte oder verschlüsselte Dateien können einen anderen Speicherplatz als die logische Dateigröße belegen.
  • Verknüpfte Dateien geben das N- fache der Anzahl der Verknüpfungen und der Dateigröße für die logische Dateigröße an, der physische Speicherplatz ist jedoch in der Regel geringer.
Archimedes Trajano
quelle
Im Allgemeinen könnte das wahr sein. Aber in meinem Fall war eine hohe Zuordnungseinheit das Problem.
VFSORAKI
3
Ja, ich versuche nur, die Antwort zu ergänzen, indem ich weitere mögliche Gründe für die Diskrepanz anführe.
Archimedes Trajano
6

Sie sollten einen Blick auf den Eintrag Block Suballocation in Wikipedia werfen. Genau das passiert mit dir. 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, die Festplatte neu formatieren zu müssen.

In einigen Fällen kann das Problem durch einfaches Speichern dieser Dateien in einem Archiv behoben werden (und die kleinen Dateien werden auch komprimiert, wenn am Ende der Dateien kein Speicherplatz mehr verfügbar ist). Dies hat den Nachteil, dass einige Zeit für die Dekompression aufgewendet werden muss.

Eine andere Option, wenn Sie aufgrund eines bestimmten anwendungsbezogenen Problems so viele kleine Dateien 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 und nicht für Endbenutzer.

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

kriss
quelle
0

Ich habe in Windows 10 große Unstimmigkeiten bei der Dateigröße einer einzelnen Datei festgestellt. Wenn ich mir jedoch die Eigenschaften der SAME-Datei vom selben Speicherort (einem Netzwerklaufwerk) wie in Windows XP ansehe, ist die große Unstimmigkeit nicht vorhanden. Nur ein kleiner Unterschied, den Sie erwarten würden. Ich denke, es gibt einen Fehler in Windows 10. Eine Datei mit 449 MB nimmt wahrscheinlich nicht 3,99 GB ein, was mir Windows 10 mitteilt.

David Hutchins
quelle
1
Nur zu
Ihrer Information