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

Requêtes MySQL Discussion :

MySQL problème de mémoire


Sujet :

Requêtes MySQL

  1. #1
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut MySQL problème de mémoire
    Bonjour à tous,

    J'ai crée une base de données de type INNODB. Je dois y charger de très grandes séquences d'ADN. J'utilise comme type de colonne LONGTEXT car j'ai vu que sa taille peut aller jusqu'à 2^23 (8.388.608) caractères. Malgrè cela, je n'arrive pas à y charger une séquence de 5.000.000 caractères.

    Mon script PERL interroge un site internet afin d'y prendre les informations, met le tout dans un tableau indexé ($Table). Ensuite, PERL crée une DB MySQL et y charge les informations en faisant une boucle sur le tableau. Cela fonctionne très bien avec des séquences de petite taille (180.000).

    J'arrive a charger jusqu'à 1.000.000 caractères, mais pas plus. Peut-être devrais-je vider la mémoire SQL. J'aimerais également savoir à quoi cela sert il de mettre un "$sth3->finish;", est-ce utile dans mon cas?

    Je commence par créer une table:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my($sql) = "CREATE TABLE $Table (Acc VARCHAR(20) PRIMARY KEY, Type VARCHAR(10), Gi VARCHAR(20), Souche VARCHAR(50), Isolat VARCHAR(50),Taxon VARCHAR(50), Description TEXT, Origine VARCHAR(50), Note TEXT, Sequence LONGTEXT) ENGINE = InnoDB;";
    my($sth) = $DBconnect->prepare($sql) or print "prepare error\n";
    $sth->execute or die "Could not execute SQL statement ... maybe invalid?";

    Ensuite,j'y charge les entrées une à une en utilsant une boucle lisant mon tableau indexé (contenant les informations) ligne par ligne. Je fais cela en deux temps, j'insers toutes mes clés primaires ($Acc) puis ensuite les autres champs.

    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
          foreach my $Acc (keys %$Ref)
            {
     
                    my($sql2) = "INSERT INTO $Table(Acc) values ('$Acc');";
                    my($sth2) = $DBconnect->prepare($sql2) or print "prepare error\n";
                    $sth2->execute or die "Could not execute SQL2 statement ... maybe invalid?";
     
                    my $Hash=$Ref->{$Acc};
     
                    foreach my $Champ (keys %$Hash)
                    {
                            my $Valeur = $Ref->{$Acc}->{$Champ};
     
     
     
                            if (($Champ eq "Sequence") & (length $Valeur > 2**23)) 
                            {
                                    $Valeur="<html><a href=\"http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=$Acc\">Sequence (Lien GenBank)<\/a><\/html>";
     
                            }
     
                            my($sql3) = "UPDATE $Table SET $Champ = '$Valeur' WHERE Acc like '$Acc';";
                            my($sth3) = $DBconnect->prepare($sql3) or print "prepare error\n";
                            $sth3->execute or die "Could not execute SQL2 statement ... maybe invalid?";
                            $sth3->finish;
     
                    }


    En cas où ma séquence dépasse 2^23, j'aimerais mettre dans ma DB un lien vers le fichier internet contenant cette séquence. Je ne sais pas quelle balise ou quel code écrire dans mon script PERL. Avec ce qui est écrit plus haut, dans ma DB est noté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html><a href="http://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?db=nucleotide&val=NC_005945">Sequence (Lien GenBank)</a></html>

    J'utilise Active Perl 5.8.3 et EasyPHP 1.8. (= MySQL 4.1.9)


    Merci beaucoup,


    Jasmine,

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Par défaut
    Il t'affiche "Could not execute SQL2 statement ... maybe invalid?" ou pas ?

    si tu affiches $sql3 il a bien la chaine complète, ou il y a t'il que 1.000.000 de caractères ?

    pour le fonctionement générale je ne sais pas si c'est perl mais habituelement pour
    IF (($Champ eq "Sequence") & (length $Valeur > 2**23))
    J'aurais mis &&, mais je ne pense pas que ca résoudrais ton problème. Car le problème n'est pas a ce niveau si ca marche avec les petites chaines.

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    J'ai le même problème que Leishmaniose. Mes séquences n'ont pas de caractères spéciaux mais sont de simples chaînes de texte et je ne les importe pas d'un fichier texte mais de Genbank directement. Malgré cela le message d'erreur et le problème sont les mêmes que les siens.

    http://www.developpez.net/forums/showthread.php?t=7001

    Je lui écris un MP mais il ne vient peut être plus sur ce site.


    Je peux charger jusqu'à 1150000 caractères, plus cela plante et stop net le chargement en indiquant comme erreur "MySQl server has gone away".


    Le problème ne se situe pas au niveau de mon IF car normalement je ne dois jamais passer dans cette boucle car mes séquences sont plus petites que 2**32. Ce qu'il y a c'est que dès que je dépasse une longueur de 1150000 le programme plante alors que le type LONGTEXT est censé pouvoir aller jusquà une capacité bien plus grande. La mauvaise solution que j'ai trouvé est de remplacer 2**32 par 1150000 cela contourne le problème mais ne le résoud pas.


    Merci,


    Jasmine,

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Par défaut
    MySQL a une taille de requete maximum par défaut à 1Mo.

    Source : http://dev.mysql.com/doc/refman/5.0/fr/gone-away.html
    Citation Envoyé par Site de mysql
    Vous pouvez aussi obtenir ces erreurs si vous envoyez une requête incorrecte ou trop grande au serveur. Si mysqld re¸oit un paquet trop large ou mal ordonné, il suppose que quelque chose s'est mal passé au niveau du client et ferme la connexion. Si vous avez besoin de grande requêtes (par exemple, si vous travaillez avec de grandes colonnes BLOB) vous pouvez augmenter la taille limite des requêtes en démarrant mysqld avec l'option -O max_allowed_packet=# (1 Mo par défaut). Le surplus de mémoire est alloué à la demande, ce qui fait que mysqld n'utilisera de la mémoire que lorsque vous emmétrez une grande requête ou qu'il aura à retourner de grandes réponses ! Plus d'informations sur la configuration de la taille des paquets sont disponibles dans la section Section A.2.9, « Erreur Packet too large ».
    Vu qu'on lui envois plus de 1Mo il coupe a 1Mo. Voici comment resoudre ca :
    http://dev.mysql.com/doc/refman/5.0/...too-large.html

    Il suffit d'ajouter un parametre quant on lance le serveur mysql
    mysqld --max_allowed_packet=16M
    Ou alors d'éditer le fichier de config (beaucoup plus sympa a long terme)
    Citation Envoyé par Site de mysql
    [mysqld]
    max_allowed_packet=16M
    Avant MySQL 4.0, utilisez cette syntaxe :
    Citation Envoyé par Site de mysql
    [mysqld]
    set-variable = max_allowed_packet=16M
    Ca devrais être ça ^^.

  5. #5
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Merci beaucoup pour cette réponse si bien détaillée. Je vais m'y mettre de suite.

    You can also use an option file to set max_allowed_packet. For example, to set the size for the server to 16MB, add the following lines in an option file:

    [mysqld]
    max_allowed_packet=16M
    Est ce bien le fichier "config.ini" qui est le fichier d'options? J'ai peur d'aller modifier au mauvais endroit et d'y mettre des erreurs. Il se trouve où?

    J'ai dans le répertoire mysql\data\npdsmysql\data\npds les fichiers:
    config.frm
    config.MYD
    config.MYI

    et dans le répertoire mysql
    my.ini
    A mon avis c'est "my.ini" que je dois changer car en description il est indiqué "paramètres de configuration". Il me dit de modifier le fichier "my.ini" du répertoire EasyPHP1-8\conf_files.



    Bonne journée.

  6. #6
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    CA FONCTIONNE

    Merciiiiiiiiiiiiiiii

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL-5.1] MySQL : Problème mémoire serveur Linux
    Par Dakral dans le forum Administration
    Réponses: 0
    Dernier message: 17/09/2014, 13h30
  2. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  3. [EJB2.1 Entity] [CMP] [MySQL] Problème avec clé primaire en auto increment
    Par tery dans le forum Java EE
    Réponses: 6
    Dernier message: 16/07/2004, 11h28
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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