Remplacer le text rapidement dans un file très volumineux

J'ai 25GB file text qui a besoin d'une string remplacée sur seulement quelques lignes. Je peux utiliser sed avec succès, mais cela prend vraiment beaucoup de time à courir.

 sed -i 's|old text|new text|g' gigantic_file.sql 

Y a-t-il un moyen plus rapide de le faire?

Tu peux essayer:

 sed -i '/old text/ s//new text/g' gigantic_file.sql 

De cette ref :

OPTIMISATION DE LA VITESSE: Si la vitesse d'exécution doit être augmentée (en raison de gros files d'input ou des processeurs lents ou des disques durs), la substitution sera exécutée plus rapidement si l'expression "find" est spécifiée avant de donner le "s /…/. ../" instruction.

Voici une comparaison sur un file 10G. Avant:

 $ time sed -i 's/original/ketan/g' wiki10gb real 5m14.823s user 1m42.732s sys 1m51.123s 

Après:

 $ time sed -i '/ketan/ s//original/g' wiki10gb real 4m33.141s user 1m20.940s sys 1m44.451s 

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 25Go d'un disque plus rapidement. Vous pouvez get une amélioration mineure si vous ne l'éditez pas, et vous écrivez le résultat du sed sur un disque séparé (si vous en avez un disponible) – parce que de cette façon vous pouvez lire de l'un, en écrivant à l'autre et il y a un peu less de conflits en conséquence.

Vous pourriez peut- être accélérer un peu en n'utilisant pas le moteur regex pour chaque ligne – par exemple en utilisant perl (je suis sûr que vous pouvez le faire avec sed mais je ne connais pas la syntaxe) – cela va commencer à partir de la ligne 10 000.

 perl -pe '$. > 10_000 && s/old_text/new_text/g' 

Et s'il y a une sorte de complication dans les RE (métacaractères), la minimisation de ceux-ci améliorera légèrement l'efficacité du moteur regex.

Si les texts nouveaux et anciens ont la même longueur, vous pouvez searchr dans le file et écrire uniquement les octets modifiés, au lieu de copyr le file entier. Sinon, vous êtes coincé dans le déplacement de beaucoup de données.

Note: ceci est difficile et implique l'écriture de code personnalisé.

Consultez la page de manuel de fseek si vous travaillez en C ou en C ++ ou si vous utilisez des enveloppes de langage favoris pour searchr et écrire des appels système.

Si vous n'utilisez que la command line et que vous pouvez get les décalages d'octets du text, vous pouvez écrire le text de rlocation en place avec des commands "dd" soigneusement écrites.