10
votes

Comment faire du fichier clairsemé?

Si j'ai un grand fichier contenant de nombreux zéros, comment puis-je en faire efficacement un fichier rare?

est la seule possibilité de lire le fichier entier (y compris tous les zéros, qui peuvent être stockés de manière clairse) et de la réécrire à un nouveau fichier à l'aide de rechercher les zones zéro?

ou y a-t-il une possibilité de faire cela dans un fichier existant (E.G. File.SetsParse (démarrage long, extrémité longue))?

Je recherche une solution en Java ou dans certaines commandes Linux, le système de fichiers sera ext3 ou similaire.


11 commentaires

La première solution est implémentée dans 'cp -sparse = toujours', mais ce n'est pas efficace et nécessite de copier le fichier et de se déplacer par la suite.


Stackoverflow.com/Questtions/245251 / ...


@Joe: Il s'agit de créer un fichier rare à partir de zéro, mais je souhaite que tout établisse un fichier existant clairsemé.


@Rurouni Désolé, survolez cette partie. Cela semble assez fastidieux de le faire de Java.


Si votre format de fichier actuel contient beaucoup de zéros, pouvez-vous modifier votre format de fichier afin que cela n'a pas besoin de?


@Joe: Je suppose que ce sera impossible en Java, mais je m'attendrais à ce que l'outil Linux existe si cela est possible du tout (ce qui devrait être, car cela signifie que cela signifie uniquement changer l'inode et supprimer des références de blocs)


@Peter: Le format de fichier est optimisé pour la performance (une vitesse d'accès élevée est encore plus importante que la présence de peuples) et des trous peuvent ouvrir et fermer dans différentes zones au fil du temps (mais souvent dans des plages consécutives). Ces fichiers occupent quelques téraoctets et environ 50 à 80% sont des zéros.


@Runouni, si les trous sont suffisamment grands, il vaut peut-être rompre le fichier et utiliser le système de fichiers pour supprimer / supprimer des sections.


Faire un fichier clairson entraînerait des sections fragmentées si elles ont été réutilisées. Je pense que vous seriez mieux de pré-allouer tout le fichier et de maintenir une table / bitset des pages / sections occupées. Sauvegarder peut-être que quelques tubercules d'espace disque ne valent pas la performance d'un fichier hautement fragmenté.


@Peter: Cela pourrait être une solution, parfois je ne vois pas la solution évidente ;-)


@Rurouni, je peux voir que vous souhaitez que le système d'exploitation fasse cela pour vous. Mais je ne pense pas qu'il y ait un moyen facile de Java (ou même c) d'obtenir le système d'exploitation.


5 Réponses :


0
votes

Selon ce Article , il semble qu'il n'y ait actuellement aucune solution facile, à l'exception de l'utilisation de FIMAP IOCTL . Cependant, je ne sais pas comment vous pouvez faire des blocs de zéro "non clairsemé" dans "clairsemé".


0 commentaires

2
votes

Je pense que vous seriez mieux de pré-allouer tout le fichier et de maintenir une table / bitset des pages / sections occupées.

Faire un dossier clairsemé entraînerait la fragmentation de ces sections si elles ont été réutilisées. Sauvegarder peut-être que quelques tubercules d'espace disque ne valent pas la performance d'un fichier hautement fragmenté.


0 commentaires

4
votes

Certains systèmes de fichiers sur Linux / Unix ont la possibilité de "percer des trous" dans un fichier existant. Voir:

  • Postage LKML sur la fonctionnalité
  • FAQ sur le fichier Unix (recherche pour f_freesp)

    Ce n'est pas très portable et n'a pas fait de la même manière à travers le tableau; À l'heure actuelle, je crois que les bibliothèques IO de Java ne fournissent pas d'interface pour cela.

    Si le poinçonnage du trou est disponible via fcntl (f_freesp) ou via n'importe quel autre mécanisme, il doit être nettement plus rapide qu'une boucle de copie / de recherche.


2 commentaires

Savez-vous s'il existe un outil qui l'applique à un fichier car je ne suis pas un pirate de rapport C expérimenté.


Dans Linux, utilisez le drapeau Falloc_fl_punch_hole dans automate .



0
votes

Vous pouvez utiliser $ truncate -s FileName FileName FileSize (code> sur borne Linux pour créer un fichier clairsemé avec

Seulement des métadonnées.

note --FileSize est en octets.


1 commentaires

Deux problèmes ici: (1) Vos arguments sont à l'envers, il devrait être TRONCATE -S Taille FileName . ( Taille peut réellement être dans toutes les unités spécifiées, par exemple 10k = 10240 octets, 2 Mo = 2000000 octets). (2) La question pose de la question de créer un fichier existant Sparse, alors que cela ne créera qu'un nouveau fichier de plaide (ou étendre un fichier existant avec une région clairsemé à la fin).