IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

erreur : "vm_allocate(size=8421376) failed (error code=3)" et ouverture de fichier


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut erreur : "vm_allocate(size=8421376) failed (error code=3)" et ouverture de fichier
    Bonjour,

    j'ai un script shell de mise à jour d'une base de données qui a été développé avant que j'arrive. Ce script appelle différents scripts Perl.

    Quand je le lance, j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    perl(24870) malloc: *** vm_allocate(size=8421376) failed (error code=3)
    perl(24870) malloc: *** error: can't allocate region
    perl(24870) malloc: *** set a breakpoint in szone_error to debug
    Out of memory!
    j'ai d'abord été voir sur le serveur s'il restait de la place, et j'obtiens ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bsmc:~/Documents/update/human admin$ df
    Filesystem              512-blocks      Used      Avail Capacity  Mounted on
    /dev/disk0s2            1464477344 543186960  920778384    37%    /
    devfs                          196       196          0   100%    /dev
    fdesc                            2         2          0   100%    /dev
    <volfs>                       1024      1024          0   100%    /.vol
    /dev/disk1s2            1464477344    304848 1464172496     0%    /Volumes/Server HD 2
    /dev/disk2s2            1464477344    304848 1464172496     0%    /Volumes/Server HD 1
    automount -nsl [152]             0         0          0   100%    /Network
    automount -fstab [157]           0         0          0   100%    /automount/Servers
    automount -static [157]          0         0          0   100%    /automount/static
    j'en ai déduit qu'il restait de la place vu que y'a que 37% d'utilisé, c'est ça?

    en allant voir dans le script, j'ai vu ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #transcript sequences file 
    open(TRANSCRIPTS_FILE,$ARGV[0]);
    @transcripts=<TRANSCRIPTS_FILE>;
    sachant que le fichier en question fait quelque chose comme 118Mo, est ce que ça peut être la cause de l'erreur que j'obtiens?
    sachant que visiblement, ce script marchait bien avant car il a déjà été utilisé plusieurs fois sans problème (avant que j'arrive biensur )

    je pose la question avant de tout changer, car le script est pas simple : il y a d'abord une initalisation sur la première ligne du fichier (élément 0 du tableau @transcripts) et seulement après une boucle for pour faire un traitement sur le reste des lignes...
    et comme c'est un script qui est déjà en production, je voudrais avoir confirmation de mes doutes avant de tout changer en prenant le risque d'y mettre des erreurs...

  2. #2
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    en attendant d'avoir votre avis sur le possible impact de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    open(TRANSCRIPTS_FILE,$ARGV[0]);
    my @transcripts=<TRANSCRIPTS_FILE>;
    sur l'erreur rencontrée, j'ai essayé de modifier le code pour ne plus stocker tout le fichier d'un coup. J'aimerais être sur de ne pas avoir fait d'erreur avant de le tester car je ne peux que le tester sur le serveur en prod...

    voilà le code avant modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    use strict;
     
    #transcript sequences file 
    open(TRANSCRIPTS_FILE,$ARGV[0]);
    my @transcripts=<TRANSCRIPTS_FILE>;
     
     
    #source of transcript sequences
    my $transcript_source=$ARGV[1]; 
     
    #name of the anchoring enzyme and sequence of its restriction site 
    my $enzyme=$ARGV[2];
    my $restriction_site=uc($ARGV[3]); #if restriction site sequence isn't written in capital letters, we write it in capital letters
    $restriction_site =~ s/\s//g; #keep out eventual blanks in the sequence
     
     
    #initialization:
     
    #one transcript sequence
    my $transcript_seq=''; 
    #one transcript description line (i.e. the line beginning by ">" excepted the symbol ">")
    chomp($transcripts[0]);
    my $transcript_line_desc=substr($transcripts[0],1,length($transcripts[0])); 
     
    #number of virtual tags extracted from transcript sequences
    my $tags_nb=$ARGV[4]+1;
    #number of transcript sequences
    my $transcripts_nb=$ARGV[5]+1;
     
     
    #opening of load data files
    open(TAGS,">>loaddata_VirtualTag");
    open(CONNECTION,">>loaddata_VirtualTagTranscript");
    open(TRANSCRIPTS,">>loaddata_Transcript");
     
     
     
     
    #reading of the transcript file from second line 
    #(the first one was used for initialization)
    for (my $i=1; $i<=$#transcripts; $i++)
    {
     
        my $line=$transcripts[$i];
        chomp($line);
     
        if ($line =~ /^>/){
     
            #analyzing the previous transcript sequence
    	$transcript_seq =~ s/\s//g; #keep out eventual blanks in the sequence
    	$transcript_seq = uc($transcript_seq); #if transcript sequence isn't written in capital letters, we write it in capital letters 
     
            #finding the virtual tags in the transcript sequence
    	my @tags_id = Find_Tags($transcript_seq,$tags_nb,$enzyme,$restriction_site);
    	if ($#tags_id != -1)
    	{
    	    $tags_nb = $tags_id[$#tags_id]+1; #incrementation of the number of virtual tags already extracted from transcript sequences
    	}
     
            #analyzing transcript sequence
    	Analyze_Transcript($transcript_seq,$transcript_line_desc,$transcripts_nb,$transcript_source);
     
    	#connection between virtual tags and transcript
    	foreach my $id (@tags_id)
    	{
    	    print CONNECTION $id."\t".$transcripts_nb."\n";
    	}
     
            #consideration of the next transcript sequence
    	$transcript_line_desc=substr($line,1,length($line));
    	$transcripts_nb ++;
    	$transcript_seq='';
        }
     
        else
        {
    	$transcript_seq .= $line;
        }
    }
     
    #analyzing the last transcript sequence
     
    $transcript_seq =~ s/\s//g; #keep out eventual blanks in the sequence
    $transcript_seq = uc($transcript_seq); #if transcript sequence isn't written in capital letters, we write it in capital letters 
     
    #finding the virtual tags in the transcript sequence
    my @tags_id = Find_Tags($transcript_seq,$tags_nb,$enzyme,$restriction_site);
    $tags_nb = $tags_id[$#tags_id]; #incrementation of the number of virtual tags already extracted from transcript sequences
     
    #analyzing transcript sequence
    Analyze_Transcript($transcript_seq,$transcript_line_desc,$transcripts_nb,$transcript_source);
     
    #connection between virtual tags and transcript
    foreach my $id (@tags_id)
    {
        print CONNECTION $id."\t".$transcripts_nb."\n";
    }
     
     
     
    #closing of files to load into corresponding tables
    close TAGS;
    close CONNECTION;
    close TRANSCRIPTS;
    close TRANSCRIPTS_FILE;
     
    #printing number of virtual tags and transcripts in files to load into corresponding tables
    print "$tags_nb\n$transcripts_nb\n";
     
    exit;
    et voilà le code après mes modifications :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    use strict;
     
    #transcript sequences file 
    open(TRANSCRIPTS_FILE,$ARGV[0]);
     
    #my @transcripts=<TRANSCRIPTS_FILE>;
     
     
    #source of transcript sequences
    my $transcript_source=$ARGV[1]; 
     
    #name of the anchoring enzyme and sequence of its restriction site 
    my $enzyme=$ARGV[2];
    my $restriction_site=uc($ARGV[3]); #if restriction site sequence isn't written in capital letters, we write it in capital letters
    $restriction_site =~ s/\s//g; #keep out eventual blanks in the sequence
     
     
    #initialization:
     
    #one transcript sequence
    my $transcript_seq = ''; 
     
    #one transcript description line (i.e. the line beginning by ">" excepted the symbol ">")
    my $transcript_line_desc; 
     
    #number of virtual tags extracted from transcript sequences
    my $tags_nb = $ARGV[4]+1;
    #number of transcript sequences
    my $transcripts_nb = $ARGV[5]+1;
     
     
    my $first_line = 1;
     
    #opening of load data files
    open(TAGS,">>loaddata_VirtualTag");
    open(CONNECTION,">>loaddata_VirtualTagTranscript");
    open(TRANSCRIPTS,">>loaddata_Transcript");
     
    while(my $line = <TRANSCRIPTS_FILE>)
    {
    	if($line =~ m/^>(.+)/ && $first_line == 1)
    	{
    		$transcript_line_desc = $1;
    		$first_line = 0;
    	}
    	elsif($line =~ m/^>(.+)/ && $first_line != 1)
    	{
    		#analyzing the previous transcript sequence
    		$transcript_seq =~ s/\s//g; #keep out eventual blanks in the sequence
    		$transcript_seq = uc($transcript_seq); #if transcript sequence isn't written in capital letters, we write it in capital letters 
     
    		#finding the virtual tags in the transcript sequence
    		my @tags_id = Find_Tags($transcript_seq,$tags_nb,$enzyme,$restriction_site);
    		if ($#tags_id != -1)
    		{
    			$tags_nb = $tags_id[$#tags_id]+1; #incrementation of the number of virtual tags already extracted from transcript sequences
    		}
     
    		#analyzing transcript sequence
    		Analyze_Transcript($transcript_seq,$transcript_line_desc,$transcripts_nb,$transcript_source);
     
    		#connection between virtual tags and transcript
    		foreach my $id (@tags_id)
    		{
    			print CONNECTION $id."\t".$transcripts_nb."\n";
    		}
     
    		#consideration of the next transcript sequence
    		$transcript_line_desc = $1;
    		$transcripts_nb ++;
    		$transcript_seq = '';
    	}
    	else
    	{
    		$transcript_seq .= $line;
    	}
    }
     
    #analyzing the last transcript sequence
     
    $transcript_seq =~ s/\s//g; #keep out eventual blanks in the sequence
    $transcript_seq = uc($transcript_seq); #if transcript sequence isn't written in capital letters, we write it in capital letters 
     
    #finding the virtual tags in the transcript sequence
    my @tags_id = Find_Tags($transcript_seq,$tags_nb,$enzyme,$restriction_site);
    $tags_nb = $tags_id[$#tags_id]; #incrementation of the number of virtual tags already extracted from transcript sequences
     
    #analyzing transcript sequence
    Analyze_Transcript($transcript_seq,$transcript_line_desc,$transcripts_nb,$transcript_source);
     
    #connection between virtual tags and transcript
    foreach my $id (@tags_id)
    {
        print CONNECTION $id."\t".$transcripts_nb."\n";
    }
     
     
     
    #closing of files to load into corresponding tables
    close TAGS;
    close CONNECTION;
    close TRANSCRIPTS;
    close TRANSCRIPTS_FILE;
     
    #printing number of virtual tags and transcripts in files to load into corresponding tables
    print "$tags_nb\n$transcripts_nb\n";
     
    exit;
    Auriez vous des commentaires / améliorations à apporter ?
    Et surtout, ces deux codes font-ils bien la même chose ?

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Par défaut
    "je ne peux que le tester sur le serveur en prod"
    => très mauvais et très dangereux !

    Ton code a l'air bon (le début du remplacement du for par un while),
    mais tu dois absolument trouver un moyen de tester.

    Mais il faut bien voir qu'en Perl, il y a de nombreuses possibilités d'erreur et de suppression/effacement au niveau filesystem.
    Qu'est ce qui t'empêche de simplement copier le fichier que tu passe en argument, et de copier ton script dans une autre arboresence ? Il vaut mieux passer un peu de temps à se préparer un mini-environnement de dev (même si c'est une recopie à un autre endroit de ton serveur de prod car tu n'as qu'un serveur) que de perdre tes données de production et de perdre beaucoup de temps à les restaurer ou à les reconstruire.

Discussions similaires

  1. Installation failed with error code: (0x00001A91)
    Par fahdijbeli dans le forum Windows 7
    Réponses: 1
    Dernier message: 03/10/2013, 23h00
  2. erreur procédure Error Code: 1064
    Par annesoKKK dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/05/2013, 00h20
  3. Réponses: 3
    Dernier message: 07/12/2011, 13h48
  4. LogonUser() failed with error code 1326
    Par Zhamy dans le forum C#
    Réponses: 5
    Dernier message: 03/06/2010, 17h01
  5. [Debutant]erreur lors de la sauvegarde d un code.
    Par Mr_Chut dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 27/04/2004, 19h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo