J'ai un fichier texte de 25 Go qui a besoin d'une chaîne remplacée sur seulement quelques lignes. Je peux l'utiliser sed
avec succès, mais cela prend beaucoup de temps pour fonctionner.
sed -i 's|old text|new text|g' gigantic_file.sql
Existe-t-il un moyen plus rapide de procéder?
sed
replace
large-files
eisaacson
la source
la source
Réponses:
Tu peux essayer:
De cette référence :
Voici une comparaison sur un fichier 10G. Avant:
Après:
la source
sed
est mal orthographié. J'ai édité ce post hier pour corriger la dernièresed
commande qui devrait êtretime sed -i '/original/ s//ketan/g' wiki10gb
et nontime sed -i '/ketan/ s//original/g' wiki10gb
. Je reviens à mon montage aujourd'hui parce que 1. les temps ne correspondent plus à la commande et 2. J'ai fait le même test avec GNU sed sur un fichier de 3 Go et je n'observe aucune différence entre les deuxsed
alternatives. Je soupçonne que la différence de temps est due à une faute d'orthographe.time
résultats, mais dans l'ensemble, il n'y avait pas de différence de temps.La réponse courte est "Non" - votre facteur limitant sur ce type d'opération est le disque IO. Il n'y a aucun moyen de diffuser plus rapidement 25 Go de disque. Vous pourriez obtenir une amélioration mineure si vous n'effectuez pas de modification sur place et que vous écrivez le résultat de la
sed
sur un lecteur séparé (si vous en avez un de disponible) - parce que de cette façon, vous pouvez lire à partir de l'un, tout en écrivant sur un autre et il y a légèrement moins de conflits en conséquence.Vous pourrez peut- être l'accélérer un peu en n'utilisant pas le moteur d'expression régulière pour chaque ligne - donc par exemple en utilisant perl (je suis sûr que vous pouvez le faire avec
sed
mais je ne connais pas la syntaxe) - cela commencera à partir de ligne 10 000 et suivantes.Et s'il y a des complications dans les RE (métacaractères), leur minimisation améliorera légèrement l'efficacité du moteur d'expression régulière.
la source
sed -i '10000,$ s/old_text/new_text/g'
sed
compare - je suppose légèrement plus rapide, mais pas beaucoup à cause de la taille du fichier.sed
dansperl
, mais celui - ci vous permet également d' écrire des scripts plus bavard aussi.Si les nouveaux et les anciens textes ont la même longueur, vous pouvez rechercher dans le fichier et écrire uniquement les octets modifiés, au lieu de copier tout le fichier. Sinon, vous êtes coincé dans le déplacement de nombreuses données.
Remarque: ceci est délicat et implique l'écriture de code personnalisé.
Consultez la page de manuel de fseek si vous travaillez en C ou C ++, ou vos wrappers de langage préférés pour les appels système de recherche et d'écriture.
Si vous insistez sur l'utilisation de la ligne de commande uniquement et que vous pouvez obtenir les décalages d'octets du texte, vous pouvez écrire le texte de remplacement en place avec des commandes "dd" soigneusement écrites.
la source