web-dev-qa-db-fra.com

Qu'est-ce qu'un fichier clairsemé et pourquoi en avons-nous besoin?

Qu'est-ce qu'un fichier clairsemé et pourquoi en avons-nous besoin? La seule chose que je peux obtenir, c'est que c'est un très gros fichier et qu'il est efficace (en gigaoctets). Comment est-il efficace?

15
Luv33preet

Supposons que vous ayez un fichier contenant de nombreux octets vides \x00. Ces nombreux octets vides \x00 sont appelés trous. Le stockage d'octets vides n'est tout simplement pas efficace, nous savons qu'il y en a beaucoup dans le fichier, alors pourquoi les stocker sur le périphérique de stockage? Nous pourrions plutôt stocker des métadonnées décrivant ces zéros. Lorsqu'un processus lit le fichier, ces blocs de zéro octet sont générés dynamiquement au lieu d'être stockés sur un stockage physique (regardez ce schéma de Wikipedia):

Sparse File - Wikipedia

C'est pourquoi un fichier clairsemé est efficace, car il ne stocke pas les zéros sur le disque, mais contient plutôt suffisamment de données décrivant les zéros qui seront générés.

Remarque: la taille du fichier logique est supérieure à la taille du fichier physique pour les fichiers épars. En effet, nous n'avons pas stocké physiquement les zéros sur un périphérique de stockage.


Modifier:

Lorsque vous exécutez:

$ dd if=/dev/zero of=output bs=1G count=4

La commande copie ici des blocs 4G d'octets nuls dans output. Pour voir ça:

$ stat output
File: ouput
  Size: 4294967296      Blocks: 8388616    IO Block: 4096   regular file
--omitted--

Vous pouvez voir que ce fichier a des blocs 8388616 qui lui sont alloués, ces blocs ne stockent rien mais octets vides copié à partir de /dev/zero et ils occupent de l'espace disque physique, ce sont des trous stockés sur le disque (zéros épars). dd a fait ce que vous aviez demandé, en copiant des blocs de données d'un fichier à un autre.

Maintenant, exécutez cette commande pour détecter les trous et rendre le fichier clairsemé sur place:

$ fallocate -d output
$ stat output
File: swapfile
  Size: 4294967296      Blocks: 0          IO Block: 4096   regular file
--omitted--

Avez-vous remarqué quelque chose? Le nombre de blocs est maintenant de 0 car les blocs qui ne stockaient que des octets vides ont été désalloués. Rappelez-vous, les blocs de output ne stockent rien, seulement un tas de zéros vides, fallocate -d a détecté les blocs qui ne contiennent que des zéros vides et les a désalloués, car tous les blocs de ce fichier contiennent des zéros, ils ont tous été désalloués.

Notez également comment la taille est restée la même. Il s'agit de la taille logique (virtuelle) du fichier, pas de sa taille sur le disque. Il est crucial de savoir que output n'occupe pas physique d'espace de stockage maintenant, il a 0 blocs qui lui sont alloués et donc je n'utilise pas vraiment d'espace disque. La taille préservée après l'exécution de fallocate -d donc lorsque vous lisez plus tard le fichier, vous obtenez les octets vides générés par le système de fichiers lors de l'exécution. La taille physique de output est cependant nulle, elle n'utilise aucun bloc de données.

N'oubliez pas que lorsque vous lisez le fichier output, les octets vides sont générés dynamiquement par le système de fichiers au moment de l'exécution, ils sont pas réellement stockés physiquement sur le disque et la taille du fichier telle que rapportée par stat est la taille logique et la taille physique est nulle pour output. Dans ce cas, le système de fichiers doit générer 4 Go d'octets vides lorsqu'un processus lit le fichier.

Pour générer un fichier fragmenté à l'aide de dd:

$ dd if=/dev/zero of=output2 bs=1G seek=0 count=0
$ stat 
stat output2
  File: output2
  Size: 4294967296      Blocks: 0          IO Block: 4096   regular file

GNU dd utilise en interne lseek et ftruncate, donc vérifiez truncate (2) et lseek (2).

11
direprobs

Un fichier épars est un fichier qui est principalement vide, c'est-à-dire qu'il contient de grands blocs d'octets dont la valeur est 0 (zéro).

Sur le disque, le contenu d'un fichier est stocké dans des blocs de taille fixe (généralement 4 Ko ou plus). Lorsque tous les octets contenus dans un tel bloc sont 0, un système de fichiers qui implémente des fichiers clairsemés ne stocke pas le bloc sur le disque, mais conserve les informations quelque part dans les métadonnées du fichier.

Avantages de l'utilisation de fichiers clairsemés:

  • des blocs de données vides n'occupent pas d'espace disque; ils ne sont pas stockés en tant que blocs de données réguliers, leurs identifiants (qui n'utilisent que plusieurs octets) sont stockés à la place dans les métadonnées du fichier; de cette façon, 4 Ko d'espace disque (ou plus) sont enregistrés pour chaque bloc vide;
  • la lecture d'un bloc de données vide à partir d'un fichier clairsemé ne prend pas de temps; cela se produit car aucune donnée n'est lue sur le disque; puisque le système de fichiers sait que tous les octets du bloc sont 0, il est simplement défini sur 0 tous les octets du tampon d'entrée et les données sont prêtes; il n'est pas nécessaire d'accéder au périphérique de stockage lent;
  • l'écriture d'un bloc de données vide dans un fichier clairsemé ne prend pas de temps; lors de l'écriture, le système de fichiers détecte que le bloc est vide (tous ses octets sont 0) et place l'ID de bloc dans la liste des blocs vides (dans le fichier de métadonnées); aucune donnée n'est écrite sur le disque.

Plus d'informations sur les fichiers épars peuvent être trouvées sur le page Wikipedia .

2
axiac