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

C# Discussion :

Performance C# & MySQL


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut Performance C# & MySQL
    Bonjour,
    Je suis en ce moment en stage et je travaille sur l'automatisation d'une tâche donnée, bon une première chose à faire c'est de prendre des informations sur des titres d'un fichier .txt et de les décortiqués et par la suite les insérer dans ma base de données. Mon problème c'est que les fichiers par moyenne contienne 5000 lignes ainsi qu'une trentaine d'attributs chose qui me prend beaucoup de temps pour l'insertion dans ma base de donnée (environ 1min30) et donc je voudrais savoir s'il y a moyen d'améliorerla performance.
    outils utilisés : C# & MySQL 5.1.
    Méthode utilisées:
    • public static MySqlConnection connexion() //pour la connexion que n'ouvre qu'une seule fois question d'optimiser
    • public static void inserer(string requeteInsert,MySqlConnection connection)

    Merci de m'aider dans les limites du possible !
    N.B: mon application ne prend pas bcp de ressources mémoire et CPU!

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    5000 lignes / 90 s = 55,5 lignes / s = 18 ms / ligne ... et donc ?

  3. #3
    Membre chevronné Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Par défaut
    Salut,
    à priori ce qui prend le plus de temps ce sont les appels entre ton appli et la base.
    Tu pourrais par ex. créer une procédure stockée dans MySql qui pendrait en paramètre la chaîne de caractères correspondant au contenu du fichier, et qui effectuerait les insert, ce qui te permettrait de traiter un fichier entier avec un seul appel.
    Ceci dit je saurai faire ça en T-Sql, par contre sous MySql je ne sais pas si c'est possible, si un connaisseur peut nous éclairer ?

  4. #4
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut
    Non pour le temps je pense qu'on peut faire mieux ! puisque j'ai fais un truc sur access j'ai défini la norme dans laquelle est écrit mon fichier texte et lorsque j'importe le fichier ça ne prends pas beaucoup de temps ! environ 10s

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    327
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 327
    Par défaut
    Bonjour,
    Ce qui prend du temps, c'est le fait que tu insert ligne par lign eje crois d'après ce qui a été dis.
    Il faudrait insérer tout le fichier en méme temps.
    Essaye de le mettre dans un dataset peut etre et apres de mettre a jour le dataset dans le BD MySQL.
    C'est une piste je ne suis pas sûr que ce soit réalisable.
    Ce qui est sur c'est que c'est le fait de traiter les lignes une par une qui te fait perdre du temps.
    A bientôt

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Bonjour

    Personellement j'utilise beaucoup MySql et je n'ai jamais vraiment eu de problème de performance

    90 secondes me semblent effectivement beaucoup !

    Les causes peuvent etre nombreuses et tu ne donne pas beaucoup de détails

    C'est un peut etre un problème d'acces a ton fichier source;
    C'est un peut etre un problème de parsage de ton fichier source;
    C'est un peut etre un problème d'acces a la base elle meme !
    C'est peut etre un probleme de traitement dans ta methode inserer ?

    etc...

  7. #7
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut
    bon pour plus de détails j'utilise le MySQL Connector NEt 5.1.7 ainsi que MySQL 5.1, il me semble que ce retard est dû plus à la liaison Application-SGBD et non pas au SGBD lui même ! moi j'ai réalisé une procédure stockée qui prend en paramètre les attributs de ma base de données et je l'appel à chaque fois que la lecture d'une ligne est faite, Sachant que je traite le fichier en insérant chaque attribut comme un élément d'un tableau. (Connexion MySQL.data.dll que j'ajoute à mes références) , s'il y a une manière plus éfficace dites le moi! et merci.

  8. #8
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut
    Bonjour,
    Wakan je vois pas comment je pourrais insérer tous les fichiers en une seul fois déjà vu la syntaxe de INSERT !

  9. #9
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Montre ta commande insert si tu peux !

  10. #10
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE DEFINER=`root`@`localhost` PROCEDURE `insertionMouvementSuspens`(IN parm1 int,IN parm2 int,IN parm3 varchar(10), IN parm4 int(2), IN parm5 varchar(18), IN parm6 varchar(12), IN parm7 varchar(18), IN parm8 int(4), IN parm9 int(2),IN parm10 int(3), IN parm11 int(4), IN parm12 int(2), IN parm13 int(3), IN parm14 int(13), IN parm15 int(13), IN parm16 varchar(10), IN parm17 varchar(10), IN parm18 int(2), IN parm19 varchar(20), IN parm20 bigint(12), IN parm21 varchar(10),IN parm22 varchar(10))
     
    BEGIN
         insert into cdvm.mouvementsuspens values (parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10,parm11,parm12,parm13,parm14,parm15,parm16,parm17,parm18,parm19,parm20,parm21,parm22);
    END;
    je fais appel à cette procédure à chaque fois que je décortique la ligne,après je lui passe les éléments du tableau qui contient les attributs.

  11. #11
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Sincerement je ne suis pas familier de cette syntaxe MySql en c#

    Voici un autre exemple de syntaxe que j'utilise personnelement
    Qr est un petit wrapper que j'ai ecrit qui fait un executescalar dans ce cas ci

    Maintenant si ton import de fichier texte est un one-shot tu peux aussi utiliser MysqlImport qui est tres rapide !

    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
          MySql.Data.MySqlClient.MySqlCommand MyCmd = new MySql.Data.MySqlClient.MySqlCommand();
     
          string ins = "INSERT INTO address "
                       + " (UserID,PostCode,NIS,Plaats,StraatNaam,HuisNum,Omschrijving,X,Y) "
                       + " VALUES ( "
                       + " ?UserID,"
                       + " ?PostCode,"
                       + " ?Nis,"
                       + " ?Plaats,"
                       + " ?Straat,"
                       + " ?Huis,"
                       + " ?Desc,"
                       + " ?X,"
                       + " ?Y )";
     
          MyCmd.CommandText = ins;
          MyCmd.Parameters.AddWithValue("?UserID", txbUserID.Text);
          MyCmd.Parameters.AddWithValue("?PostCode", txb_Post.Text);
          MyCmd.Parameters.AddWithValue("?Nis", curNIS);
          MyCmd.Parameters.AddWithValue("?Plaats", txb_Plaats.Text);
          MyCmd.Parameters.AddWithValue("?Straat", txb_Rue.Text);
          MyCmd.Parameters.AddWithValue("?Huis", txb_Num.Text);
          MyCmd.Parameters.AddWithValue("?Desc", txb_Desc.Text);
          MyCmd.Parameters.AddWithValue("?X", X);
          MyCmd.Parameters.AddWithValue("?Y", Y);
     
     
          int ID = (int)qr.execQueryReturnLastId(MyCmd);

  12. #12
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut
    c'est exactement ce que je fais, Ce que je viens de te montrer c'est que la syntaxe SQL de ma procédure stockée. moi aussi je passe à travers des fonctions que j'ai défini sur une classe Connexion et qui utilise la même chose. on reste toujours ligne par ligne ! (mon fichier je peux pas l'injecter entant que flux entier de dois le traiter avant).

  13. #13
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Citation Envoyé par kobe24 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE DEFINER=`root`@`localhost` PROCEDURE `insertionMouvementSuspens`(IN parm1 int,IN parm2 int,IN parm3 varchar(10), IN parm4 int(2), IN parm5 varchar(18), IN parm6 varchar(12), IN parm7 varchar(18), IN parm8 int(4), IN parm9 int(2),IN parm10 int(3), IN parm11 int(4), IN parm12 int(2), IN parm13 int(3), IN parm14 int(13), IN parm15 int(13), IN parm16 varchar(10), IN parm17 varchar(10), IN parm18 int(2), IN parm19 varchar(20), IN parm20 bigint(12), IN parm21 varchar(10),IN parm22 varchar(10))
     
    BEGIN
         insert into cdvm.mouvementsuspens values (parm1,parm2,parm3,parm4,parm5,parm6,parm7,parm8,parm9,parm10,parm11,parm12,parm13,parm14,parm15,parm16,parm17,parm18,parm19,parm20,parm21,parm22);
    END;
    je fais appel à cette procédure à chaque fois que je décortique la ligne,après je lui passe les éléments du tableau qui contient les attributs.
    Bonjour,
    Je pense que pour les procedures stockées, on à un accès au disque dur chaque fois que cette procedure est appelé, il vaut meiux que les traitement soient fait a l'interieur du code de l'application (en C#avec le connector/NET)
    Cordialement

  14. #14
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut
    prière d'éclaircir la méthode exacte !!

  15. #15
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Citation Envoyé par kobe24 Voir le message
    prière d'éclaircir la méthode exacte !!
    Au lieu d'utiliser une procedure stockée,a l'interieur de ta boucle tu fais un insert simple avec CSharp et le connecteur/NET. sans créer de procedure stocké. un insert simple. pour la raison suivante:
    Je pense qu'une procedure stocké va d'abord etre chargé depuis le disque vers la memoire centrale chaque fois que tu vas l'appeler, ensuite la requette INSERT va etre executé (deux passes). Si tu insert directement avec INSERT tu vas probablement réduir le temps d'execution, du moins en theorie

    Cordialement

  16. #16
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut
    je pense que j'ai la poisse car j'ai déja essayé avec une requête SQL simple sans faire appel à la procédure stockée mais le temps reste presque le même !

  17. #17
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    re:
    Essaye alors de mettre entre le début de l'insertion et la fin la requette SQL suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    START TRANSACTION;
    // fais tes insertion ici
    COMMIT;
    cordialement

  18. #18
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Je pense que buggen25 est sur une bonne piste

    Tu peux t'inspirer du code que je t'ai montré

    Tu peux aussi provisoirement ne pas faire d'insertion du tout pour t'assurer que la lenteur n'est pas dans un autre traitement !!

  19. #19
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Par défaut
    non la lenteur est dans l'insertion puisque moi je fais au même temps un affichage sur une listView et une insertion dans la base de données. et j'ai commencé avec l'affichage et ça ne durait que deux secondes ! je pense que si je trouve pas de solution je vais mettre une barre de progression question de focaliser l'attention de l'utilisateur sur autre chose que le temps. vous en pensez quoi ?

  20. #20
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Tu as déja essayé mysqlimport ?
    Et l'insertion sans passer par la procedure stockée

    Juste pour voir..

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/03/2014, 14h15
  2. Problème performance sous requête MySQL
    Par Razielwar dans le forum Requêtes
    Réponses: 17
    Dernier message: 23/02/2012, 12h11
  3. Performances comparatives de MySQL
    Par pat06 dans le forum Requêtes
    Réponses: 0
    Dernier message: 22/01/2008, 18h12

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