2011-05-13 6 views
8

Si j'ai un gros fichier contenant beaucoup de zéros, comment puis-je en faire un fichier clairsemé?Comment rendre le fichier fragmenté?

Est-ce que la seule possibilité est de lire le fichier entier (y compris tous les zéros, qui peuvent être stockés de manière parcimonieuse) et de le réécrire dans un nouveau fichier en cherchant à ignorer les zones zéro?

Ou existe-t-il une possibilité de faire cela dans un fichier existant (par exemple File.setSparse (long start, long end))?

Je suis à la recherche d'une solution Java ou de certaines commandes Linux, Filesystem sera ext3 ou similaire.

+3

La première solution est implémentée dans 'cp --sparse = always', mais cela n'est pas efficace et nécessite de copier le fichier et de le déplacer ensuite. – rurouni

+1

http://stackoverflow.com/questions/245251/create-file-with-given-size-in-java – joe776

+0

@joe: il s'agit de créer un fichier fragmenté à partir de zéro, mais je veux faire un fichier existant éparpillé. – rurouni

Répondre

3

Certains systèmes de fichiers sous Linux/UNIX ont la capacité de "percer des trous" dans un fichier existant. Voir:

Ce n'est pas très portable et ne se fait pas de la même manière dans tous les domaines; en ce moment, je crois que les bibliothèques d'E/S de Java ne fournissent pas d'interface pour cela.

Si la perforation est disponible via fcntl(F_FREESP) ou par tout autre mécanisme, elle devrait être significativement plus rapide qu'une boucle de copie/recherche.

+0

savez-vous s'il existe un outil qui l'applique à un fichier car je ne suis pas un hacker expérimenté. – rurouni

+0

réponse de qualité supérieure. Merci – sehe

0

Selon ce article, il semble qu'il n'y ait actuellement aucune solution facile, à l'exception de l'utilisation de FIEMAP ioctl. Cependant, je ne sais pas comment vous pouvez faire des blocs vides "non clairsemés" en blocs "clairsemés".

2

Je pense que vous feriez mieux de pré-allouer le fichier entier et de maintenir une table/BitSet des pages/sections qui sont occupées.

Si un fichier était fragmenté, ces sections seraient fragmentées si elles étaient réutilisées. Peut-être économiser quelques To de l'espace disque ne vaut pas le coup de performance d'un fichier très fragmenté.

0

Vous pouvez utiliser $ truncate -s filename filesize sur teminal linux pour créer un fichier clairsemé ayant

les métadonnées.

NOTE --Filesize est en octets.

Questions connexes