Maison  >  Article  >  développement back-end  >  Pourquoi io.Copy() crée-t-il de gros fichiers clairsemés et comment pouvez-vous les copier efficacement tout en préservant leur parcimonie ?

Pourquoi io.Copy() crée-t-il de gros fichiers clairsemés et comment pouvez-vous les copier efficacement tout en préservant leur parcimonie ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-30 06:32:27606parcourir

Why does io.Copy() create large sparse files, and how can you efficiently copy them while preserving their sparseness?

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

  • Envisagez d'utiliser os.Rename() pour déplacer des fichiers dans le même système de fichiers, évitant ainsi d'avoir à les copier.
  • Reportez-vous au numéro Go n° 13548 pour plus d'informations sur la création de fichiers tar clairsemés.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn