Exécution sed sur gros fichier - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 10-12-2007 à 15:05:19
sed bosse ligne par ligne, à priori tu n'as jamais les 8go chargés en mémoire... donc c'est plutôt un problème de vitesse non ?
Marsh Posté le 10-12-2007 à 15:15:25
"ma machine sature" : j'ai un message "sed : couldn't re-allocate memory"
La mémoire virtuelle de mon pc est insuffisante, quand j'exécute tout mon fichier sed, que ce soit sur l'ensemble du fichier texte ou sur une partie.
Marsh Posté le 10-12-2007 à 15:21:36
Si c'est un problème de vitesse, je ne vois pas comment optimiser mon code...
J'ai une liste de mots dans un fichier. Je souhaite supprimer toutes les occurrences de ces mots dans mon gros fichier texte. Pour cela je fais :
awk '{print "s/\t"$2"//g"}' liste_mots.txt >> comm_sed.sed
sed -f comm_sed.sed fichier_entree.txt > fichier_sortie.txt
Est-ce que je m'y prends mal ?
Marsh Posté le 10-12-2007 à 15:33:00
ca fait pareil avec -u ?
Marsh Posté le 10-12-2007 à 15:40:55
ReplyMarsh Posté le 10-12-2007 à 15:54:53
et ta liste de mots est "propre" ? Je veux dire, tu génères pas des tonnes de
s/ //g |
ou autre conneries ? genre un de tes mots contient /...
Marsh Posté le 10-12-2007 à 16:11:09
Xavier_OM a écrit : et ta liste de mots est "propre" ? Je veux dire, tu génères pas des tonnes de
|
J'ai pas pensé à échapper les caractères spéciaux s'il y en a, en effet
Tu penses que le problème viendrait plus de là que de la taille des fichiers ?
Marsh Posté le 10-12-2007 à 16:26:40
LinoaKwak a écrit : |
Ben je sais pas trop, la taille du fichier c'est pas trop un problème normalement (sauf si tu as tes 8Go sur une seule ligne, auquel cas )
On peut faire "facilement" des boucles infinis en sed, genre
{ echo 1;echo 2;}|sed 'H;${x;P;D;}' |
mais là tu fais du delete très basique, donc ca doit pas être ca... d'un autre côté, je n'ai pas un fichier de 8go de toto sous la main pour voir si s/toto//g explose tout
Marsh Posté le 10-12-2007 à 17:15:39
En réduisant la taille du fichier sed j'arrive à des temps corrects... Par contre je me retrouve avec un fichier vide :-D
Y a-t-il une façon simple d'échapper les caractères spéciaux ? (sans parcourir tous les mots pour mettre un backslash devant chaque caractère spécial)
genre en faisant un s/'toto'//g ...
Marsh Posté le 10-12-2007 à 17:31:15
LinoaKwak a écrit : En réduisant la taille du fichier sed j'arrive à des temps corrects... Par contre je me retrouve avec un fichier vide :-D |
faudrait un truc du genre
sed 's/[;<>\*\|`&\$!#\(\)\[\]\{\}:]/\\&/g' |
mais bon je suis pas convaincu que ca marche
Marsh Posté le 10-12-2007 à 14:58:47
Bonjour,
Je souhaite exécuter un gros fichier contenant des instructions sed (2.600.000 lignes de substitution) sur un gros fichier texte de 8Go.
Si je tente directement un sed -f mon_fichier.sed mon_gros_fichier.txt bien évidemment ma machine sature rapidement et je ne peux jamais obtenir mon résultat.
Comment puis-je exécuter mon script en un temps raisonnable ?
J'ai tenté 2 méthodes :
- exécuter mes commandes sed une à une sur mon gros fichier, mais cela prend trop de temps (plusieurs heures pour une instruction...)
- exécuter mon fichier sed sur des morceaux de mon fichier, mais j'ai des problèmes de mémoire !
Des idées ? ou dois-je investir dans du super matos de la mort ?