Pourquoi existe-t-il une si grande différence entre «Taille» et «Taille sur le disque»?

302

Comme vous pouvez le voir ci-dessous, il y a tellement de différence entre les champs Taille et Taille sur le disque de mon dossier. Pourquoi donc?

Capture d'écran montrant 50 875 fichiers dans 1 504 dossiers, 105 Mo représentant 1,43 Go sur le disque

Je sais que la taille sur le disque devrait être un peu plus que la taille en raison des unités d'allocation dans Windows, mais pourquoi tant de différence? Serait-ce à cause du grand nombre de fichiers?

BTW, ce dossier est sur la carte SD de mon téléphone Android. À l'intérieur de cela, mon application Cartes stocke les cartes en cache et l'application tire sa carte de Google Maps.

vfsoraki
la source
10
Bonjour thelastblack, et bienvenue à SuperUser. J'ai modifié votre question pour supprimer la partie sur la défragmentation, car les deux réponses existantes se concentrent sur la différence de taille entre disques et que le format Stack Exchange fonctionne mieux lorsque chaque question publiée porte sur un seul élément. Vous pouvez certainement poser à nouveau cette question en tant que question distincte, même si je pense que les réponses que vous avez reçues jusqu'à présent sur cette question montrent que la défragmentation ne vous aidera pas. (En général, cela ne sert à rien sur les supports à l'état solide.) N'hésitez pas à éditer davantage votre question si vous pensez que j'ai changé votre intention de quelque manière que ce soit.
un CVn
1
@ MichaelKjörling Heh, je viens d'éditer une discussion mineure sur la fragmentation (j'ai été distrait un peu plus tôt)
Bob
21
@ MichaelKjörling Ne modifiez pas les questions de manière rétroactive pour adapter les réponses. Une des réponses aborde la partie fragmentation de la question de OP. Votre modification doit être annulée pour éviter toute confusion.
DanteTheEgregore
5
@DanteTheEgregore Si vous vous référez à la réponse de Bob, qui a en fait été modifiée pour traiter également des effets de la fragmentation, alors, avant de lancer l'arme, vérifiez les historiques de modification et les horodatages de cette réponse et de la question. Au moment de mon montage, la réponse de Bob ne couvrait pas du tout la question de la fragmentation. Si le PO veut le faire, retoucher dans "Est-ce que la défragmentation des médias m'aidera?" devrait résoudre toute confusion en suspens, même si j’estime qu’il est préférable de poser cette question séparément; OMI la question de la différence entre les deux valeurs est sans rapport.
un CVn
11
Il me semble que cette application est sérieusement mal programmée - envisagez de déposer un rapport de bogue. Je ne suis en aucun cas un programmeur professionnel, mais j’ai une fois piraté quelque chose de similaire dans JavaME, et l’un des problèmes que j’avais à résoudre était de savoir comment stocker efficacement toutes ces petites tuiles de carte (stockage et accès) dans un conteneur. J'ai fini par utiliser des fichiers zip non compressés.
A. Donda

Réponses:

303

Je vais supposer que vous utilisez le système de fichiers FAT / FAT32 ici, puisque vous mentionnez qu'il s'agit d'une carte SD. NTFS et exFAT se comportent de manière similaire en ce qui concerne les unités d’allocation. Les autres systèmes de fichiers peuvent être différents, mais ils ne sont quand même pas supportés par Windows.

Si vous avez beaucoup de petits fichiers, c'est certainement possible. Considère ceci:

  • 50 000 fichiers.

  • Taille de cluster de 32 Ko (unités d'allocation), ce qui correspond au maximum pour FAT32

Ok, l’ espace minimum pris est de 50 000 * 32 000 = 1,6 Go (en utilisant des préfixes SI, et non binaires, pour simplifier les calculs). L'espace occupé par chaque fichier sur le disque correspond toujours à un multiple de la taille de l'unité d'allocation. Dans ce cas, nous supposons que chaque fichier est suffisamment petit pour tenir dans une seule unité, avec de l'espace (gaspillé) laissé.

Si la taille moyenne de chaque fichier est de 2 ko, vous obtiendrez un total d'environ 100 Mo - mais vous perdez également 15 fois (30 ko par fichier) en moyenne en raison de la taille de l'unité d'allocation.


Explication approfondie

Pourquoi cela arrive-t-il? Eh bien, le système de fichiers FAT32 doit garder une trace de l'emplacement de stockage de chaque fichier. S'il devait conserver une liste de chaque octet, la table (comme un carnet d'adresses) grandirait à la même vitesse que les données - et perdrait beaucoup d'espace. Ils utilisent donc des "unités d'allocation", également appelées "taille de cluster". Le volume est divisé en ces unités d’allocation et, en ce qui concerne le système de fichiers, elles ne peuvent pas être subdivisées - ce sont les plus petits blocs qu’elle peut traiter. Un peu comme si vous aviez un numéro de maison, mais votre facteur se fiche du nombre de chambres à coucher ou de personnes qui y vivent.

Alors que se passe-t-il si vous avez un très petit fichier? Eh bien, le système de fichiers ne se soucie pas de savoir si le fichier est de 0 ko, 2 ko ou même de 15 ko, cela lui donnera le moins d’espace possible - dans l’exemple ci-dessus, cela correspond à 32 ko. Votre fichier utilise seulement une petite quantité de cet espace, et le reste est essentiellement gaspillé, mais appartient toujours au fichier - un peu comme une chambre que vous laissez inoccupée.

Pourquoi existe-t-il différentes tailles d'unités d'allocation? Cela devient un compromis entre avoir une table plus grande (carnet d'adresses, par exemple, en disant que John est propriétaire d'une maison située au 123, rue Fake, 124, rue Fake, 666, voie Satan, etc.) ou davantage d'espace inutilisé dans chaque maison. Si vous avez des fichiers plus volumineux, il est plus logique d'utiliser des unités d'allocation plus grandes, car un fichier ne reçoit pas une nouvelle unité (maison) tant que tous les autres ne sont pas remplis. Si vous avez beaucoup de petits fichiers, eh bien, vous allez quand même avoir une grande table (carnet d'adresses), alors vous pouvez aussi leur donner de petites unités (maisons).

En règle générale, les grandes unités d'allocation gaspillent beaucoup d'espace si vous avez beaucoup de petits fichiers. Il n’ya généralement pas de bonne raison de dépasser 4 ko pour un usage général.


Fragmentation?

En ce qui concerne la fragmentation, la fragmentation ne devrait pas gaspiller de l’espace de cette manière. Les gros fichiers peuvent être fragmentés, c'est-à-dire fractionnés, en plusieurs unités d'allocation, mais chaque unité doit être renseignée avant le démarrage de la suivante. La défragmentation peut économiser un peu d'espace dans les tables d'allocation, mais ce n'est pas votre problème spécifique.


Solutions possibles

Comme suggéré par gladiator2345 , vos seules options réelles à ce stade sont de vivre avec ou de reformater avec des unités d'allocation plus petites.

Votre carte peut être formatée en FAT16, qui impose une limite inférieure à la taille de la table et nécessite donc des unités d’allocation beaucoup plus grandes afin de traiter un volume plus important (avec une limite supérieure de 2 Go avec 32 unités d’allocation). Source gracieuseté de Braiam . Si c'est le cas, vous devriez quand même pouvoir formater en toute sécurité le format FAT32.

Bob
la source
3
L'espace perdu en raison des tailles d'allocation minimales est en fait techniquement appelé "fragmentation interne", vous pouvez donc dire que la fragmentation est le coupable. Mais ce n'est toujours pas quelque chose qu'un outil de "défragmentation" peut faire.
Hobbs
3
(Moins techniquement, cela s'appelle simplement "slack".)
hobbs
1
La taille des clusters limite également la taille maximale du système de fichiers. Par exemple, si votre espace d'adressage est 32 bits, vous avez un total d'environ 4,29 milliards de clusters. Maintenant, si vous utilisez la plus petite taille de cluster prise en charge par NTFS (512 octets), vous pouvez adresser un maximum de 512 * 2 ^ 32 octets = 2 Gio. Si vous avez besoin d’un volume capable de stocker plus de 2 Gio de données, vous devez augmenter la taille du cluster. Tout cela est indépendant du fichier le plus volumineux que vous tentez de stocker, étant donné que vous ne pouvez pas stocker un fichier de plus de 2 Go, ce qui est le moindre de vos problèmes.
Andon M. Coleman
4 clusters KiB vous permettront d'adresser des fichiers dans un volume d'une taille maximale de 16 To, ce qui devrait suffire dans un avenir prévisible.
Andon M. Coleman
1
Eh bien, il pourrait compresser ses archives de petits fichiers en un seul gros fichier.
einpoklum
45

C’est l’une des situations dans lesquelles la compression / l’archivage dans un fichier unique peut aider. Ce que Bob a dit dans sa réponse est vrai, mais la solution peut être plus simple que de reformater le disque, comme le suggèrent d’autres réponses. Si vous compressez ou archivez le répertoire (à l'aide de zip, de tar ou de toute autre méthode), le système de fichiers verra que vous avez un seul gros fichier au lieu de plusieurs plus petits. Même sans compression, vous récupérerez près de 1,4 Gio d'espace, car tous ces "petits fichiers" seront comptés comme un seul gros fichier.

À l'intérieur de cela, mon application Cartes stocke ses cartes en cache et l'appli obtient de Google Maps.

Vous devriez peut-être discuter avec le développeur de l'utilisation d'une archive ou d'une base de données au lieu de plusieurs fichiers. Cela aidera probablement aussi à avoir le disque moins fragmenté et permettra sûrement de gagner de la place, en particulier s'il s'agit d'un lecteur flash NAND. Si vous expliquez la situation ridicule où 100 Mo de données utiles / utiles deviennent 1,4 Go, il y a un problème avec la façon dont les données sont stockées et les développeurs doivent apporter une solution plus agréable.

Braiam
la source
1
> À l'intérieur de cette application, mon application Cartes stocke les cartes en cache et l'appli de Google Maps. - Malheureusement, dans ce cas, la compression (qui est en réalité un système de fichiers supérieur à celui de base) nécessiterait le support de cette application de cartographie.
Bob
1
@Bob alors la solution doit venir du côté développeur D:
Braiam
4
C'est totalement vrai. Je pense que pour le moment, je devrais changer d'application.
vfsoraki
17
@Braiam Cela n'incite pas le système de fichiers à penser qu'il n'y a qu'un fichier; il n'y a qu'un seul fichier. La raison pour laquelle les développeurs ne stockent pas les informations de cache dans une archive est probablement due au fait que la plupart des formats d'archive ne sont pas conçus pour des écritures aléatoires rapides, ce dont un cache a certainement besoin. Une meilleure alternative pourrait être d'utiliser une bibliothèque de base de données légère telle que SQLite.
bcrist le
1
Absolument vrai ..... +1
arundevma
25

Au cas où quelqu'un serait confronté à ce problème, il pourrait être utile de savoir qu'une autre raison de constater une grande différence de taille de fichier / d'espace disque est l'utilisation de flux de données alternatifs (ADS).

Cela s'applique uniquement à NTFS à ma connaissance. Les ADS sont connus pour leurs utilisations légitimes et non légitimes:

  • marquer un fichier téléchargé depuis Internet
  • pour stocker des métadonnées (Microsoft souhaitait inclure une partie de la fonctionnalité du système d'exploitation Apple, comme ne pas utiliser l'extension de fichier pour déterminer le type d'un fichier)
  • masquer des données ou du code dans le contexte d'un malware .

ADS simplement: n'importe quel fichier NTFS peut contenir plusieurs flux de données (comprendre les "sous-fichiers"). L'un est le flux principal, utilisé par l'explorateur Windows et d'autres outils Windows, il contient le contenu habituel d'un fichier. Les flux de données alternatifs peuvent contenir d'autres informations, exactement comme le flux principal, mais ils ne peuvent pas être gérés directement par les outils Windows (en particulier, l'explorateur affiche la taille du fichier égale à la taille du flux principal, quelle que soit la taille de l'ADS), vous devez utiliser des outils spécialisés ou du code pour écrire, lire et localiser ADS.

Le point principal est que, en cas de différence de taille de fichier importante observée, ne négligez pas la possibilité d’ADS et de programmes malveillants cachés.

Un autre lien .

Pour expérimenter en toute sécurité avec ADS, essayez ceci au niveau DOS / CMD ...

Créez puis affichez le contenu d'un fichier à la racine de C:

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

Résultat:

C:\> The main data stream

Maintenant, ajoutez un ADS avec la même méthode, spécifiez simplement le nom ADS en plus du nom de fichier:

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

Vous venez de cacher le message secret dans le fichier. Notez que la taille du fichier dans l'Explorateur n'a pas changé malgré que nous ayons ajouté des octets dans le "secret" de ADS.

Essayez d’afficher le contenu ADS:

C:\> type test.txt:secret

Résultat:

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

CMD typene peut pas afficher le contenu de l’ADS. Nous allons utiliser le Bloc-notes à la place:

notepad test.txt:secret

Dans le Bloc-notes, nous pouvons voir le contenu de l’ADS:

The secret message

Vous pouvez également masquer un exécutable complet dans un ADS d'un fichier texte innocent et l'exécuter à tout moment. La richesse ne nuit pas aux pirates informatiques :-)

minutes
la source
Je ne suis pas un homme gagnant, mon travail est principalement effectué sous Linux. C'était très utile. Merci
vfsoraki
4
Il est utile d’utiliser un outil tel que Streams de Sysinternals pour vérifier l’utilisation de ADS. Par exemple, les fichiers téléchargés sur un système Windows peuvent être marqués avec une source dans ADS, bien que cela soit minuscule et ne prenne pas de place. Cela ne s'affichera pas dans le répertoire ou la sortie de l'explorateur normalement. Cela peut prendre des blocs et aggraver le problème d'utilisation du disque que vous étudiez. .
Adric
19

Le problème peut être dû à la taille du cluster.

Selon Microsoft :

Si vous n'utilisez pas la compression NTFS pour les fichiers ou les dossiers contenus sur le volume, la différence entre SIZE et SIZE ON DISK est une perte d'espace en raison d'une taille de cluster supérieure à celle nécessaire. Vous devez essayer d'utiliser une taille de cluster optimale de sorte que la valeur SIZE ON DISK soit aussi proche que possible de la valeur SIZE. Un écart excessif entre les valeurs SIZE ON DISK et SIZE indique que la taille de cluster par défaut est trop grande pour la taille de fichier moyenne que vous stockez sur le volume et qu'il convient de la réduire. Cela peut être effectué uniquement en sauvegardant le volume, puis en le reformatant à l'aide de la commande format et du commutateur / a pour spécifier la taille d'allocation appropriée: IE: format D: /a:2048 (cet exemple utilise une taille de cluster de 2 Ko).

Essayez de formater votre disque avec une taille de cluster plus petite.

Arundevma
la source
4
Cela dit, il ne faut pas que la taille du cluster soit inférieure à 4096 octets ou simplement pas multiple de ce nombre. Le système d'exploitation 32 bits fonctionne avec des pages (dans le cas non-PAE) de 4096 octets. L'utilisation de clusters non multiples peut donc affecter négativement les performances du système de fichiers. C'est pourquoi la taille par défaut est définie sur 4096 octets.
Ruslan
2
Pour ajouter à ce que @Ruslan a dit, les disques durs les plus récents ont maintenant une taille de secteur de 4 Ko et il serait optimal d'aligner le système de fichiers sur les secteurs physiques, et un multiple de la taille du secteur physique comme taille d'unité d'allocation.
Bob
1
@Ruslan Je pense que vous voulez dire que cela devrait être une puissance de deux fois 4096. 12288 (3 × 4096) et 20480 (5 × 4096) ne sont pas de bons choix.
Scott
9

Je vois beaucoup de gens qui recommandent de reformater votre disque avec une taille de cluster plus petite. Étant donné qu'il s'agit d'une carte SD, notez que de nombreux fournisseurs la pré-formatent à la taille de cluster recommandée pour qu'elle corresponde à la taille du cluster de la NAND (il est très important de synchroniser les deux pour obtenir des performances de lecture / écriture optimales et réduire l'usure).

Vous ne pouvez pas changer la taille du cluster de la NAND (c'est un attribut physique du matériel de votre carte SD).

Commencez par exécuter scandisk / chkdsk sur votre carte SD pour vous assurer que le problème de rapport de taille ne réside pas dans un système de fichiers corrompu.

Deuxièmement, je vous conseillerais de signaler le bogue aux développeurs de Google Map, car ce sont eux qui sont à blâmer ici. Ils devraient utiliser une méthode de stockage supérieure. En le corrigeant, l'application devrait également s'exécuter plus rapidement sur de nombreux appareils en raison de l'activité moins importante des E / S et des pilotes du système de fichiers.

Matias N Goldberg
la source
En réalité, ce n'était pas Google Maps, mais une autre application utilisant les cartes de Google. J'ai informé le développeur, et viens de supprimer ces fichiers de mon SD.
vfsoraki
7

C'est un problème général avec de nombreux systèmes de fichiers. Il y a deux facteurs en jeu ici, le nombre maximal de "blocs" qu'un système de fichiers peut gérer par volume logique et les restrictions physiques du support de stockage. Un seul fichier peut être attribué à un bloc donné (les fichiers prennent généralement autant de blocs qu’ils en ont besoin). Ainsi, un fichier texte de 64 octets peut souvent prendre de 4 k à 32 k, en fonction de la taille de bloc du système de fichiers sur lequel il réside.

Une façon de penser à cela est de penser chaque bloc du système de fichiers en tant que boîte et le système de fichiers en tant que pièce. Toutes vos boîtes ont la même taille et vous essayez d’en installer autant que vous le pouvez dans une pièce. Si vous les intégrez tous avec plus de place, vous devez obtenir des boîtes plus grandes afin que la pièce soit remplie complètement de boîtes.

Une des règles pour mettre des choses dans des boîtes est que vous ne pouvez pas mettre deux choses non liées dans une boîte. Ils doivent faire partie du même document. Donc, si je devais taper une page de texte, elle aurait sa propre boîte. Si mon texte dactylographié comportait tant de pages que je ne pouvais pas tout mettre dans une case, je trouverais simplement une autre case et continuerais d'y mettre des pages, en répétant jusqu'à ce que toutes mes pages soient classées. J'aurais aussi noté les cases que j'avais utilisées pour ce document et l'ordre des cases pour le lire en séquence.

En fonction de la manière dont j'organise les boîtes, il se peut que mon manifeste ne laisse suffisamment d'espace que pour un certain nombre de boîtes. Donc, si j’avais une grande salle à remplir, mais seulement un petit nombre de boîtes, je devrais utiliser de très grandes boîtes pour atteindre la capacité de la salle.

Donc, dans ce cas, mon document d'une page occuperait toujours une seule boîte, et rien d'autre ne le partagerait.

Les mêmes situations se présentent parmi différentes solutions de stockage. La FAT32 ne peut gérer que ce qui est considéré comme un faible nombre de "boîtes" sur les énormes disques durs actuels. Elle se termine donc avec de très grandes "boîtes" pour compenser cela.

CyberSkull
la source
6

Outre la taille des clusters, vous pouvez également avoir une différence due aux conditions suivantes:

  • Les fichiers compressés ou cryptés peuvent utiliser un espace différent de celui de la taille du fichier logique.
  • Les fichiers liés rapporteront n fois le nombre de liens multiplié par la taille du fichier pour la taille du fichier logique, mais l'espace physique utilisé est généralement inférieur.
Archimedes Trajano
la source
Généralement, cela pourrait être vrai. Mais dans mon cas, le problème était l’unité d’allocation élevée.
vfsoraki
3
Oui j'essaye juste d'ajouter quelque chose à la réponse en donnant plus de raisons possibles à la divergence.
Archimedes Trajano le
6

Vous devriez jeter un coup d'œil à l'entrée de la sous-allocation de blocs dans Wikipedia. C'est exactement ce qui vous arrive. L'utilisation d'un système de fichiers prenant en charge Tail Packaging est une solution au niveau du système de fichiers pour résoudre ce problème, en plus de modifier la taille du cluster d'allocation.

Tous ont le désagrément de devoir reformater le disque.

Dans certains cas, le simple stockage de ces fichiers dans une archive résoudrait le problème (et les petits fichiers seraient également compressés en plus de l’arrêt pour perdre de l’espace à la fin des fichiers). Cela a l'inconvénient de passer du temps à la décompression.

Une autre option si vous avez autant de petits fichiers en raison d'un problème spécifique lié à une application est de stocker vos données logicielles à l'aide d'une autre méthode (éventuellement dans une base de données). Mais bien sûr, c'est une solution pour les programmeurs, pas pour les utilisateurs finaux.

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

kriss
la source
0

J'ai noté d'énormes différences dans la taille de fichier dans Windows 10 sur un fichier individuel, mais si je regarde les propriétés du fichier SAME à partir du même emplacement (un lecteur réseau), avec Windows XP, la grande différence n'existe pas; juste une petite différence, qui est ce que vous attendez. Je pense qu’il ya un bogue dans Windows 10. Un fichier de 449 Mo ne prend probablement pas 3,99 Go, ce que Windows 10 me dit.

David Hutchins
la source
1
Juste un FYI, la question n'a rien à voir avec Windows 10. OP utilise Windows 7.
TheKB