Quel serait le moyen le plus performant de préparer un seul caractère à un fichier multi-gigaoctet (dans mon cas pratique, un fichier de 40 Go). P>
Il n'y a pas de limitation de la mise en œuvre pour le faire. Ce qui signifie qu'il peut s'agir d'un outil, d'un script shell, d'un programme dans n'importe quel langage de programmation, ... P>
8 Réponses :
Si vous voulez dire, comptez ce caractère au début de l'ensemble du fichier, d'une manière ou à l'aide de SED p> si vous moyenne de préparation du caractère à chaque ligne du fichier p>
Je veux juste dire préparer le personnage une fois au début de l'ensemble du fichier.
Si je comprends bien, cela est traité sur le niveau du système de fichiers, ce qui signifie que vous préparez des données dans un fichier, elle réécrit efficacement le fichier. C'est la même raison pour laquelle les tags ID3 dans les fichiers MP3 sont nuls, de sorte que les mises à jour futures ne réécrivent pas l'ensemble du fichier, mais il suffit de mettre à jour ces octets réservés. P>
Quelle que soit celle que vous utilisez donnera des résultats approximativement similaires. Ce que vous pouvez essayer, c'est faire des tests avec une fonction de copie personnalisée, qui lit / écrit dans de plus gros morceaux que la copie du système par défaut, par exemple 2 Mo ou 5 Mo, ce qui pourrait améliorer les performances. En fin de compte, votre disque d'E / S est le goulot d'étranglement ici. P>
Il n'y a pas de solution vraiment simple. Il n'y a pas d'appels système pour préparer des données, qu'appelez ou réécrire. P>
Mais en fonction de ce que vous faites avec le fichier, vous pouvez vous échapper avec des tours.
Si le fichier est utilisé de manière séquentielle, vous pouvez créer un Nommé tuyau et mettre Pour un accès aléatoire, un système de fichiers fusible pourrait être fait, mais probablement trop compliqué pour cela. P>
Si vous voulez que vos mains soient vraiment sales, trouvez HOWTO P>
Cela a des possibilités d'épauler de manière majeure votre système de fichiers, donc non recommandé; Bon plaisir. P> chat onecharfile. TXT BIGFILE> Namedpipe code> puis utilisez "Namedpipe" comme fichier. La même chose peut être réalisée par chat onecharfile.txt bigfile | Programme code> si votre programme prend STDIN comme entrée. P>
Je ne cherche pas nécessairement la solution la plus simple. Il devrait s'agir d'une solution performante qui peut utiliser une connaissance obscure des systèmes d'exploitation ou des systèmes de fichiers, ou peut utiliser des astuces.
Laissez le fichier avoir un bloc initial de caractères nuls. Lorsque vous préparez un caractère, lisez le bloc, insérez le caractère à gauche et à l'écriture du bloc. Lorsque le bloc est plein, alors effectuez la réécriture complète la plus chère afin de préparer un autre bloc NULL. De cette façon, vous pouvez réduire le nombre de fois par un facteur important que vous devez faire une réécriture complète. P>
Ajouté: Gardez le fichier dans deux sous-plats: un (un court) et B (un long). Réparez à une façon de votre choix. Quand un "assez gros", prépendez A à B (en réécriture) et effacer a. P>
Autre moyen: Gardez le fichier sous forme de répertoire de petits fichiers ..., A000003, A000002, A000001.
Il suffit de préparer au fichier le plus grand numéroté. Quand il est assez gros, faites le prochain fichier en séquence.
Lorsque vous devez lire le fichier, il suffit de les lire tout en ordre décroissant. P>
Voici la ligne de commande Windows ("DOS") WAY:
Mettez votre 1 caractère dans prevend.txt code> p> copy /b prepend.txt + myHugeFile fileNameOfCombinedFile
La manière absolument la plus performante semblerait être de descendre dans le niveau des secteurs et de la manière dont le fichier est réellement stocké. Je ne sais pas si le système d'exploitation devient alors un facteur, mais la plate-forme cible pourrait, de toute façon, il est utile de savoir ce que vous exécutez. P>
Je pense que c'est un cas où c est le choix évident, ce type de choses de bas niveau est exactement ce que la langue de programmation de systèmes est pour em>. P>
Pouvez-vous nous dire ce que vous finissez par faire, serait intéressant. p>
Vous pourriez être capable d'inverser votre implémentation en fonction de votre problème: appendez des caractères uniques à la fin de votre fichier. Quand il vient le temps de lire le fichier, lisez-le en inverse em>. p>
Cachez-le derrière une couche d'abstraction et il peut ne pas faire la différence pour votre code comment les octets sont stockés physiquement. P>
Je l'aime bien. C'est un peu comme ma réponse seulement plus élégante.
Si vous utilisez Linux, vous pouvez essayer d'utiliser une version personnalisée de Lecture (2) chargée avec LD_PRELOAD et demandez-la de préparer vos données à la première lecture. P>
voir https://zlibc.linux.lu/zlibc.html pour l'inspiration de la mise en œuvre. p>
Aucun système de fichiers maire prend en charge le prédrage, vous devez effécrire efficacement le fichier en question. Pourquoi voulez-vous Prepend i> un personnage à un fichier si je peux demander?
Peut-être que vous n'avez pas besoin de préparer physiquement le personnage au dossier, mais juste virtuellement. Il existe une pilote de système de fichiers qui est capable de mapper plusieurs fichiers (1byte + 40 Go) dans un seul fichier virtuel.