Si j'ai bien compris, «fichier clairsemé» signifie que le fichier peut avoir des «lacunes», de sorte que les données réellement utilisées peuvent être plus petites que la taille du fichier logique.
Comment les systèmes de fichiers Linux enregistrent-ils les fichiers sur le disque? Je suis principalement intéressé par ext4. Mais:
- Un fichier peut-il être enregistré non séquentiellement sur le disque? Par cela, je veux dire qu'une partie du fichier est située à l'adresse physique X et la partie suivante à l'adresse physique Y qui n'est pas proche de X + offset).
- Puis-je en quelque sorte contrôler la séquentialité du fichier?
Je veux allouer un fichier de 10 Go. Je veux qu'il soit séquentiel sur le disque et non divisé entre différents décalages. - Agit-il différemment entre les différents types?
linux
filesystems
hard-disk
io
hudac
la source
la source
dmsetup
programme, une interface pour le mappeur de périphériques. Cela peut être un bon choix si vous prévoyez un stockage de type base de données.iso9660
etromfs
sont incapables de le faire et nécessitent un stockage continu (parmi ceux-ci, je peux les énumérer séparément).Réponses:
Oui; ceci est connu sous le nom de fragmentation de fichiers et n'est pas rare, en particulier avec des fichiers plus volumineux. La plupart des systèmes de fichiers allouent l'espace selon les besoins, plus ou moins séquentiellement, mais ils ne peuvent pas deviner le comportement futur - donc si vous écrivez 200 Mo dans un fichier, puis ajoutez 100 Mo supplémentaires, il y a une chance non nulle que les deux ensembles de données être stocké dans différentes zones du disque (fondamentalement, toute autre écriture nécessitant plus d'espace sur le disque, survenant après la première écriture et avant la seconde, pourrait se trouver entre les deux). Si un système de fichiers est presque plein, la situation sera généralement pire: il peut ne pas y avoir de zone contiguë d'espace libre suffisamment grande pour contenir un nouveau fichier, il devra donc être fragmenté.
Vous pouvez indiquer au système de fichiers la taille cible de votre fichier lors de sa création; cela aidera le système de fichiers à le stocker de manière optimale. De nombreux systèmes de fichiers modernes utilisent une technique connue sous le nom d'allocation différée, dans laquelle la disposition sur disque d'un nouveau fichier est calculée le plus tard possible, afin de maximiser les informations disponibles lorsque le calcul est effectué. Vous pouvez aider ce processus en utilisant la
posix_fallocate(3)
fonction pour indiquer au système de fichiers combien d'espace disque doit être alloué au total. Les systèmes de fichiers modernes essaieront d'effectuer cette allocation séquentiellement.Les différents systèmes de fichiers se comportent différemment, oui. Les systèmes de fichiers basés sur les journaux tels que NILFS2 n'allouent pas de stockage de la même manière que les systèmes de fichiers basés sur les extensions tels que Ext4, et ce n'est qu'un exemple de variation.
la source
fallocate(3)
garantira la séquence des fichiers? ou fera simplement allusion au système de fichiers? Je ne peux pas le comprendre complètement à partir des pages de manuel.La commande
filefrag
vous indiquera comment votre fichier est physiquement stocké sur votre appareil:Si vous écrivez votre fichier en un seul passage, je suppose que votre fichier ne sera pas fragmenté.
La page de manuel de
fallocate
(1) est assez claire:Est-ce séquentiel? Le système essaiera d'abord d'allouer les blocs de manière séquentielle. Si ce n'est pas le cas, cela ne vous avertira pas.
la source
ext4
.filefrag
est caché dans/usr/sbin
. Mais cela semble fonctionner pour les utilisateurs ordinaires (sur ext4, au moins). Il peut être instructif pourstrace
son fonctionnement de voir comment mesurer la fragmentation par vous-même, si le manque d'avertissement vous gêne.Vous mentionnez des fichiers rares et aucune des autres réponses ne les a mentionnés.
La plupart des fichiers ne sont pas rares. La façon la plus courante de créer un fichier est de tout écrire en une seule fois, du début à la fin. Pas de trous là-bas.
Cependant, vous êtes autorisé à dire «passer à la position 1 000 000 000 000 et y écrire un octet». Cela va créer un fichier qui ressemble à un gros etaoctet, mais qui n'utilise (probablement) que 4k sur le disque. Il s'agit d'un fichier clairsemé.
Vous pouvez le faire plusieurs fois pour le même fichier, laissant de petites quantités de données dispersées dans le vaste vide.
Bien que cela puisse être utile, il y a deux inconvénients.
La première est que le fichier sera fragmenté, ce qui vous inquiète.
La seconde est que tous les programmes ne gèrent pas bien ces fichiers. Par exemple, certains logiciels de sauvegarde essaieront de sauvegarder le vide et créeront ainsi une sauvegarde beaucoup plus importante que nécessaire, peut-être trop grande pour le support de sauvegarde.
la source
Il existe au moins deux façons d'y parvenir.
Utilisez un système de fichiers avec beaucoup d'espace libre et préallouez l'espace (par exemple, utilisez un marqueur de fin de données spécifique à l'application et ajoutez des données aléatoires jusqu'à ce que la taille du fichier atteigne 10 Go). Cela ne garantit pas la création de données non fragmentées.
Utilisez un système de fichiers brut (non cuit) au lieu d'ext4 etc. Les SGBD le font parfois pour des raisons de performances. Le compromis est que vous devez faire votre propre mise en cache / journalisation / récupération, etc. si nécessaire.
Les cas où vous gagnez beaucoup en faisant cela sont relativement rares - je chercherais d'abord ailleurs pour optimiser les performances.
Voir également
Est-il vrai que les systèmes de gestion de bases de données contournent généralement les systèmes de fichiers?
la source
Si ce n'est qu'une chose unique et que la façon dont le fichier est stocké à l'origine n'est pas importante, seul le résultat compte, alors vous pouvez simplement enregistrer le fichier normalement, puis exécuter le défragmenteur de votre système d'exploitation. Ensuite, vous pouvez vérifier avec cette réponse si votre fichier est en un seul morceau, sinon, répétez. C'est la façon la plus simple de le faire, sans utiliser de commandes ou de programmes externes, mais ce n'est certainement pas la méthode la plus rapide, car elle défragmente votre disque entier.
la source
aptitude search ~ddefrag
étaientddrescueview
et lanids
bibliothèque de réassemblage de segments TCP. Votre réponse n'est pas très utile si vous ne dites pas comment le programme est appelé ou quels arguments doivent être transmis.