Comme vous pouvez le voir ci-dessous, il y a tellement de différence entre les champs Taille et Taille sur le disque dans mon dossier. Pourquoi donc?
Je sais que Taille sur le disque devrait être un peu plus que Taille à cause des unités d’allocation sous 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.
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, maintenant le minimum espace utilisé est 50 000 * 32 000 = 1,6 Go (en utilisant des préfixes SI, pas 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.
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 habitent.
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 possède une maison située au 123, rue Fake, 124, rue Fake, 666, voie Satan, etc.) ou davantage d'espace inutilisé dans chaque unité (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.
En ce qui concerne la fragmentation, la fragmentation ne devrait pas gaspiller de l’espace de cette manière. Les fichiers volumineux peuvent être fragmentés, c'est-à-dire scindé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.
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 au format 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 avec l'aimable autorisation de Braiam . Si tel est le cas, vous devriez quand même pouvoir formater en toute sécurité le format FAT32.
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 GiB d’espace, car tous ces "petits fichiers" seront comptés comme un seul grand fichier.
À l'intérieur de cela, mon application de cartes stocke ses cartes en cache et l'application tire sa carte de Google Maps.
Peut-être devriez-vous discuter avec le développeur pour utiliser une archive ou une base de données au lieu de plusieurs fichiers. Cela aidera probablement à réduire la fragmentation du disque et à économiser de l’espace, en particulier s’il s’agit d’un lecteur flash NAND. Si vous expliquez la situation ridicule dans laquelle 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.
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 autres flux de données (ADS)
Cela s'applique uniquement à NTFS à ma connaissance. Les ADS sont connus pour des utilisations légitimes et non légitimes:
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. D'autres flux de données 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, Explorer affiche une taille de 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, ne négligez pas la possibilité d’ADS et de programmes malveillants cachés.
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 type
ne 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 :-)
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 un espace perdu en raison d'une taille de cluster supérieure à celle requise. 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.
Je vois beaucoup de gens qui recommandent de reformater votre disque avec une taille de cluster plus petite. Comme il s’agit d’une carte SD, notez que de nombreux fournisseurs la pré-formatent à la taille de cluster recommandée pour correspondre à la taille de cluster du NAND (le fait de synchroniser les deux est très important pour des performances de lecture/écriture optimales et une réduction des performances. épuisé)
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é moindre des E/S et des pilotes du système de fichiers.
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 alloué à 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 entre 4 et 32 Ko, 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 complètement remplie 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 tellement de pages que je ne pouvais pas tout ranger dans une case, je trouverais simplement une autre case et continuerais à y insérer des pages et à les répéter 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 d'aujourd'hui. Elle se termine donc avec de très grandes "boîtes" pour compenser cela.
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é à l'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.
Outre la taille des grappes, vous pouvez également avoir une différence due aux conditions suivantes:
J'ai noté des différences énormes de 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, l'écart important n'est pas là; 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.