Si j'ai un grand fichier contenant de nombreux zéros, comment puis-je en faire efficacement un fichier rare? p>
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? P>
ou y a-t-il une possibilité de faire cela dans un fichier existant (E.G. File.SetsParse (démarrage long, extrémité longue))? P>
Je recherche une solution en Java ou dans certaines commandes Linux, le système de fichiers sera ext3 ou similaire. P>
5 Réponses :
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é". p>
Je pense que vous seriez mieux de pré-allouer tout le fichier et de maintenir une table / bitset des pages / sections occupées. p>
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é. p>
Certains systèmes de fichiers sur Linux / Unix ont la possibilité de "percer des trous" dans un fichier existant. Voir: P>
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. P>
Si le poinçonnage du trou est disponible via fcntl (f_freesp) code> ou via n'importe quel autre mécanisme, il doit être nettement plus rapide qu'une boucle de copie / de recherche. P>
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 code> dans
automate code>.
Vous pouvez utiliser Seulement des métadonnées. P>
note --FileSize est en octets. P> $ truncate -s FileName FileName FileSize (code> sur borne Linux pour créer un fichier clairsemé avec p>
Deux problèmes ici: (1) Vos arguments sont à l'envers, il devrait être TRONCATE -S Taille FileName code>. ( Taille i> peut réellement être dans toutes les unités spécifiées, par exemple
10k code> = 10240 octets,
2 Mo code> = 2000000 octets). (2) La question pose de la question de créer un fichier existant i> 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).
Un lot changé en 8 ans.
(cette liste :) p> TMPFS étant sur cette liste est celui que je trouve le plus intéressant. Le système de fichiers lui-même est suffisamment efficace pour consommer autant de RAM que nécessaire pour stocker son contenu, mais rendre le contenu En outre, quelque part sur le chemin GNU Les fichiers source rares sont détectés par une heuristique brut et le fichier DEST correspondant est également rattrapé. p>
blockQuote> mais il y a aussi Spécifier J'ai enfin pu prendre ma retraite mon automate -d code>
nom de fichier code> em> peut être utilisé pour Percez des trous dans les fichiers existants. Du
Fallocat (1) Code> Page man < / a>: p>
gnu
cp code> h3>
CP code> a gagné une compréhension des fichiers clairsemés. Citant le
CP (1) code> man ' / a> Concernant son mode par défaut,
- SPARSE = AUTO CODE>: P>
- SPARSE = TOUJOURS CODE>, qui active l'équivalent de copie de fichiers de ce que
automate code> est-il en place: P >
- SPARSE = TOUJOURS CODE> Pour créer un fichier DESTS SPARSESE Chaque fois que le fichier source contient une séquence suffisamment longue de zéro octets. P>
blockQuote>
goudron CPSF - source | (CD DEDIRE && TAR XPSF -) CODE> One-Liner, qui est de 20 ans My Greybeard Way de copier des fichiers clairsemés avec leur paternité préservée. P> P>
Merci. Votre conseil pour GNU CP m'a aidé. Cela fonctionne vite où d'autres outils (par exemple rsync -sparse code>) ont été lents.
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.