Exécution sed sur gros fichier

Exécution sed sur gros fichier - Codes et scripts - Linux et OS Alternatifs

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 ? :sweat:

Reply

Marsh Posté le 10-12-2007 à 14:58:47   

Reply

Marsh Posté le 10-12-2007 à 15:03:16    

ça veut dire quoi "ma machine sature"

Reply

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 ?


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

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.

Reply

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 ?

Reply

Marsh Posté le 10-12-2007 à 15:33:00    

ca fait pareil avec -u ?


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 10-12-2007 à 15:40:55    

Xavier_OM a écrit :

ca fait pareil avec -u ?


 
oui j'ai le meme message :??:

Reply

Marsh 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 /...


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

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

s/    //g


ou autre conneries ? genre un de tes mots contient /...


 
J'ai pas pensé à échapper les caractères spéciaux s'il y en a, en effet  :ange:  
Tu penses que le problème viendrait plus de là que de la taille des fichiers ?

Reply

Marsh Posté le 10-12-2007 à 16:26:40    

LinoaKwak a écrit :


 
J'ai pas pensé à échapper les caractères spéciaux s'il y en a, en effet  :ange:  
Tu penses que le problème viendrait plus de là que de la taille des fichiers ?


 
 
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 :D)
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  :D


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 10-12-2007 à 16:26:40   

Reply

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 ...

Reply

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
 
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 ...


 
 
faudrait un truc du genre  

sed 's/[;<>\*\|`&\$!#\(\)\[\]\{\}:]/\\&/g'


 
mais bon je suis pas convaincu que ca marche :/


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed