segmentation core dumped

segmentation core dumped - Perl - Programmation

Marsh Posté le 31-03-2017 à 16:27:37    

Pour un script perl permettant de segmenter une texte en mot , pour un fichier de taille 1,1 Go , j'ai obtenu l'erreur suivante :
panic: POPSTACK
Erreur de segmentation (core dumped)

 
le code est le suivant :

Code :
  1. #Script de Segmentation de corpus en mots
  2.  
  3. use strict;
  4. use utf8;
  5. use autodie;
  6.  
  7. use constant ARABIC_TEXT => '/home/lenovo/Bureau/MesTravaux/ARABICTEXT.txt';
  8. use constant FICHIER_RESULAT   => '/home/lenovo/Bureau/MesTravaux/ARABICTEXT_2.txt';
  9.  
  10.  
  11. open my $fh1, "<:utf8", ARABIC_TEXT;
  12. open my $fh_resultat, '>:utf8', FICHIER_RESULAT;
  13.  
  14. my @tab = <$fh1>;
  15. my $size = $#tab+1;
  16.  
  17. for (my $i = 0; $i < $size; $i++)
  18. {
  19.     chomp();
  20.     chomp($tab[$i]);
  21.  
  22.     my @words = split(/ /, $tab[$i]);
  23.     chomp();
  24.     foreach my $val ( @words )
  25.     {
  26.         chomp();
  27.        chomp($val);
  28.         print $fh_resultat "$val\n"; chomp($val);
  29.     }
  30.     
  31. }
  32.     
  33. close $fh1;
  34. close $fh_resultat;
  35.  
  36. comment je peux résoudre  ce type de problème ??

Reply

Marsh Posté le 31-03-2017 à 16:27:37   

Reply

Marsh Posté le 31-03-2017 à 19:08:18    

Citation :

comment je peux résoudre  ce type de problème ??

Peut-être en essayant pas de lire tout le fichier d'un coup (ce que my @tab = <$fh1>; fait) mais en faisant la lecture et le traitement ligne par ligne?
 
D'ailleurs tout tes chomp() à part celui de la ligne 20 ne servent à rien.

Reply

Marsh Posté le 31-03-2017 à 19:19:47    

Même si j'ai l'impression que le forum (ou disons gilou) fait ton boulot...
 
CODE SANS GARANTIE etc!
 
De mémoire toutes les versions de Perl à peu près modernes font du Unicode par défault, je pense qu'il est inutile de spécifier utf8 mais je ne suis pas sûr. gilou? :D  
 

Code :
  1. use strict;
  2. use warnings; #<--!!!!!!!!!!!!! OBLIGATOIRE pour un débutant
  3. use utf8;
  4. use autodie;
  5. use constant ARABIC_TEXT => 't1.txt';
  6. use constant FICHIER_RESULAT   => 'ARABICTEXT_2.txt';
  7. open my $fh1, "<:utf8", ARABIC_TEXT;
  8. open my $fh_resultat, '>:utf8', FICHIER_RESULAT;
  9. my $mot;
  10. while(($mot=<$fh1> ))
  11. {
  12.     chomp($mot);
  13.     print $fh_resultat join("\n", split(/ +/, $mot)),"\n";
  14. }
  15.    
  16. close $fh1;
  17. close $fh_resultat;

Reply

Marsh Posté le 31-03-2017 à 19:23:37    

D'abord Merci pour la réponse !!!!
    Même si j'ai l'impression que le forum (ou disons gilou) fait ton boulot...  
je poste mes problèmes et gilou ,comme étant expert en perl, m'aide à les résoudre .. comme les autres font je pense.. ceci est l'objectif du forum non ??

Message cité 1 fois
Message édité par mouda le 31-03-2017 à 19:26:04
Reply

Marsh Posté le 31-03-2017 à 19:46:48    

mouda a écrit :

je poste mes problèmes et gilou ,comme étant expert en perl, m'aide à les résoudre .. comme les autres font je pense.. ceci est l'objectif du forum non ??

C'est que - à mon avis - tu postes beaucoup de problèmes et des choses (très) simples qui prouvent que tu devrais faire un effort pour améliorer ton niveau de Perl ou simplement utiliser un moteur de recherche plutôt que de venir poster pour chaque petit truc. M'enfin bon, inutile de passer 3h à discuter là-dessus, chacun est libre de te répondre ou pas finalement...

Reply

Marsh Posté le 31-03-2017 à 19:53:02    

soit sure que poster est la dernière solution, je sais qu'il existe des moteurs de recherche ...  peut etre pour toi se sont des petites trucs...  
Dans tous les cas tu peux faire un vue et tu passes, tu n'est pas obligé à  me répondre  si mes problèmes te dérange..


Message édité par mouda le 31-03-2017 à 19:54:03
Reply

Marsh Posté le 31-03-2017 à 21:10:59    

Si tu enlèves tous les chomp(); ça fait encore coredump?
 
De toute façon ca pouvait se réécrire
 

Code :
  1. use strict;
  2.    use warnings;
  3.    use autodie;
  4.    
  5.    my $file1 = '/home/lenovo/Bureau/MesTravaux/ARABICTEXT.txt';
  6.    my $file2 = '/home/lenovo/Bureau/MesTravaux/ARABICTEXT_2.txt';
  7.    
  8.    
  9.    open my $fh1, "<", $file1;
  10.    open my $fh_resultat, '>', $file2;
  11.    
  12.    my @tab = <$fh1>;
  13.    foreach (@tab) {
  14.        chomp();
  15.        my @words = split(/\s+/, $_);
  16.        foreach (@words ) {
  17.            chomp();
  18.            print $fh_resultat "$_\n";
  19.        }
  20.    }
  21.        
  22.    close $fh1;
  23.    close $fh_resultat;


 
A+,


Message édité par gilou le 31-03-2017 à 21:19:04

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 31-03-2017 à 21:40:10    

gilou, quel est l'intérêt du chomp() ligne 17 dans ton code? Il ne peut pas y avoir de \n à la fin d'un mot non?
Bonne idée le /\s+/ (et non / +/) pour split, j'ai pas fait gaffe. :o

Reply

Marsh Posté le 31-03-2017 à 22:19:39    

Oui, tu as raison ça fait un chomp de trop.
Je peux aussi faire ca sans chomps... :whistle:  

Code :
  1. use strict;
  2.    use warnings;
  3.    use autodie;
  4.    
  5.    my $file1 = '/home/lenovo/Bureau/MesTravaux/ARABICTEXT.txt';
  6.    my $file2 = '/home/lenovo/Bureau/MesTravaux/ARABICTEXT_2.txt';
  7.    
  8.    
  9.    open my $fh1, "<", $file1;
  10.    open my $fh_resultat, '>', $file2;
  11.  
  12.    print $fh_resultat join("\n", (split(/\s+/, $_))), "\n"  while (<$fh1> );
  13.  
  14.    close $fh1;
  15.    close $fh_resultat;


 
A+,

Message cité 1 fois
Message édité par gilou le 31-03-2017 à 22:53:23

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 31-03-2017 à 22:35:36    

le problème existe toujours, merci pour vos réponses .. je vais réfléchir et chercher encore.

Reply

Marsh Posté le 31-03-2017 à 22:35:36   

Reply

Marsh Posté le 31-03-2017 à 22:36:01    

le problème existe toujours, merci pour vos réponses .. je vais réfléchir et chercher encore.

Reply

Marsh Posté le 31-03-2017 à 22:46:56    

Euh chez moi ça marche (mon dernier post) avec un fichier de lignes de mots arabes (un de tes exemples d'une autre fois)
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 31-03-2017 à 22:50:44    

gilou a écrit :

Euh chez moi ça marche (mon dernier post) avec un fichier de lignes de mots arabes (un de tes exemples d'une autre fois)
 
A+,


le pblme est du à la grande taille du fichier si nn sur un fichier de petite taille ça marche correctement

Reply

Marsh Posté le 31-03-2017 à 22:54:21    

Ce pourquoi j'ai fait une lecture ligne a ligne avec un while.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 31-03-2017 à 22:58:08    

j'ai déjà testé mais le problème n'est pas résolu, il faut faire un break into chunks et traiter chaque chunk .. ceci permet de résoudre le pblme de memoire

Reply

Marsh Posté le 31-03-2017 à 23:55:56    

gilou a écrit :

Oui, tu as raison ça fait un chomp de trop.
Je peux aussi faire ca sans chomps... :whistle:  

Code :
  1. use strict;
  2.    use warnings;
  3.    use autodie;
  4.    
  5.    my $file1 = '/home/lenovo/Bureau/MesTravaux/ARABICTEXT.txt';
  6.    my $file2 = '/home/lenovo/Bureau/MesTravaux/ARABICTEXT_2.txt';
  7.    
  8.    
  9.    open my $fh1, "<", $file1;
  10.    open my $fh_resultat, '>', $file2;
  11.  
  12.    print $fh_resultat join("\n", (split(/\s+/, $_))), "\n"  while (<$fh1> );
  13.  
  14.    close $fh1;
  15.    close $fh_resultat;


 
A+,

Ca c'est intéressant, il n'y a pas besoin de chomp() effectivement dans ce code puisque split(/\s+/, ...) l'enlève c'est bien ça?  Je vois aussi que tu as viré les :utf8 pour open, j'avais donc raison que c'est le cas/comportement par défaut?
 
edit: perl -pne "s/\s+/\n/g;" <ARABICTEXT.txt >ARABICTEXT_2.txt :D  
 

mouda a écrit :

j'ai déjà testé mais le problème n'est pas résolu, il faut faire un break into chunks et traiter chaque chunk .. ceci permet de résoudre le pblme de memoire

C'est quoi un chunk? J'ai pas testé faute d'un fichier adéquat mais en principe Perl c'est LE language pour faire du traitement de texte et il n'y a pas de limites de taille, en tout cas pas un truc ridicule comme 1,1 Go... (sachant que pour un fichier texte c'est énorme mais pour un fichier tout court non) Tu es sûr que ton problème ne vient pas d'ailleurs? C'est quoi ton code complet?


Message édité par rat de combat le 01-04-2017 à 00:07:40
Reply

Marsh Posté le 01-04-2017 à 01:16:49    

Hier j'avais un document xml qui une fois sérialisé faisait 76Mo, en mémoire, donc plusieurs fois plus gros, manipulé en perl avec LibXML, sans pb.
 
A+,


Message édité par gilou le 01-04-2017 à 01:17:12

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-04-2017 à 02:28:07    

@gilou:

Citation :

un fichier de taille 1,1 Go

(à moins que ce soit une faute de frappe?)

Reply

Marsh Posté le 01-04-2017 à 10:33:04    

Je le pense aussi, parce que la, 96Mo, c'est la taille d'une grosse encyclo juridique avec pas mal de volumes.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-04-2017 à 19:17:30    

ce n'est pas une faute de frappe c'est 1,1 Go (1 054 608 425 octets) (un fichier texte), je pense que c'est un pblme du taille parce que le code marche très bien pour un fichier de petite taille.

Reply

Marsh Posté le 02-04-2017 à 15:19:21    

S'il y a toujours cela dans votre code: my @tab = <$fh1>;  
c'est sur que ca posera probleme pour une grande taille.
Mais comme il y a aucune raison de transformer un fichier en array...
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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