io.Copy() crée de gros fichiers clairsemés : un guide complet
Contexte sur la rareté des fichiers
io.Copy() fonctionne au niveau des octets, transférant des données brutes entre un flux d'entrée et un flux de sortie. Il n'a pas la capacité de gérer la rareté des fichiers, qui est une technique d'optimisation pour stocker efficacement les données en créant des trous (zones vides) dans les fichiers.
Défis avec io.Copy()
Par conséquent, lors de la copie de fichiers fragmentés à l'aide de io.Copy(), les fichiers de destination deviennent volumineux car il n'existe aucun mécanisme pour préserver la structure des trous. io.Copy() traite les fichiers clairsemés comme s'ils étaient remplis de données, même s'ils contiennent des zones vides.
Solution de contournement à l'aide de Syscalls
Pour surmonter cette limitation, un doit contourner io.Copy() et implémenter la copie de fichiers manuellement à l'aide du package syscall. Plus précisément, les valeurs SEEK_HOLE et SEEK_DATA doivent être utilisées conjointement avec lseek(2) pour localiser les trous et les données dans les fichiers source.
Considérations spécifiques à la plate-forme
Les Les valeurs SEEK_HOLE et SEEK_DATA varient selon les plates-formes, il est donc essentiel de déterminer leurs valeurs spécifiques pour les systèmes cibles. Ces valeurs peuvent être obtenues à partir des fichiers d'en-tête ou de la documentation système. Par exemple, les systèmes Linux définissent généralement ces valeurs dans /usr/include/unistd.h.
Création de fichiers spécifiques à la plate-forme
Pour garantir la compatibilité de la plate-forme, il est recommandé de créez des fichiers spécifiques à la plate-forme contenant les valeurs SEEK_HOLE et SEEK_DATA. Cela permet aux développeurs de basculer facilement entre différentes plates-formes sans modifier le code principal.
Procédure de lecture des fichiers clairsemés
Lors de la lecture de fichiers clairsemés, la clé est d'identifier les données. contenant des régions et lire les données de ces zones. Cela implique de rechercher la région de données suivante à l'aide de SEEK_HOLE, puis de lire les données jusqu'à atteindre le trou suivant à l'aide de SEEK_DATA.
Transfert de fichiers fragmentés
Le transfert de fichiers fragmentés en tant que fichiers fragmentés nécessite un étape supplémentaire. Selon le système de fichiers cible, fallocate(2) peut être utilisé pour créer des trous dans le fichier de destination. Si fallocate(2) n'est pas pris en charge, il est possible de combler le trou avec des blocs remis à zéro et d'espérer que le système d'exploitation les convertit en trous réels.
Considérations sur le système de fichiers
Il est important de noter que certains systèmes de fichiers ne prennent pas en charge les trous. Si le système de fichiers cible entre dans cette catégorie, il n'est pas possible de créer des fichiers fragmentés à l'aide de cette technique.
Conseils supplémentaires
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!