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

Windows Forms Discussion :

[VB2005 & SQL SERVER] récupération d'une grande quantité de données


Sujet :

Windows Forms

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut [VB2005 & SQL SERVER] récupération d'une grande quantité de données
    Bonjour à tous.

    Une question technique pour changer ^^.

    Je fais une petite requête sur un DB de type sql server. Jusqu'à là, pas de soucis, connexion ok et récupération des données ok.

    Il s'agit d'une table de plusieurs millions de records avec une bonne 15aine de champs. Ce sont en fait des transactions caisse de magasins...

    Tant que ma requête porte sur un petit intervalle de temps avec un nombre restreint de champs, pas de soucis. Il faut parfois attendre un peu mais ça passe, un backgroundworker, une ptite boule qui tourne et j'suis content.

    Le problème est que j'ai besoin de pouvoir effectuer une requête sur plusieurs moi qui doit récupérer tous les champs.

    Donc ma connexion fonctionne, mon backgroundworker et ma p'tite boule tournent bien mais au bout d'un temps, la p'tite boule se bloque, redémarrer qqes temps puis s'arrête de nouveau.

    J'ai été voir dans le Task Manager... Dans la colonne "Mem Usage", la valeur oscille autour de 700.000K et retombe parfois en dessous de 100.000K pour remonter quelques secondes plus tard à 800.000K et ainsi de suite.

    N'y connaissant rien là dedans, je m'interroge. Est-ce que je manque de mémoire virtuelle pour récupérer les données ? Est-ce la requête prend trop de temps ? Est-ce le programme "travaille" encore ? (cela sembre être le cas)

    Pouvez-vous me conseiller ?

    Merci d'avance.

    Griftou.

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Du neuf !

    Je viens d'avoir le message fatidique de windows "You system is to low on virtual memory...". C'est donc bien un problème de ram. Sachant que j'ai absolument besoin de pouvoir faire cette requête, y a-t-il un moyen de contourner le problème ?

    J'ai déjà pensé à diviser la requête en requêtes portant sur une période plus réduite mais bon... cela semble assez casse gueule.

    J'espère que quelqu'un aura une idée. Moi à part ajouter de la ram (et encore... il en faudrait combien ? ), j'vois pas.

    Griftou.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Points : 41
    Points
    41
    Par défaut
    Peut-etre une piste :

    il te faut à mon sens améliorer ta requête SQL en indexant correctement la base de données.
    Regarde donc du coté optimisation du requetage.

  4. #4
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Ce n'est pas un problème de performance au niveau vitesse ^^.

    Le souci est que la quantité de données récupérées est trop importante pour pouvoir être gêrée d'un bloc.

    Finalement, ayant la date sous forme YYYYMMDD, je me suis pensé sur une boucle qui exécute une requête pour chaque jour compris dans l'intervalle.

    Je suis encore en train d'analyser le tout et d'écrire le lda mais j'ai opté pour un système avec 3 threads. Un premier qui récupère les données dans un dataset, un second qui les transfères dans un dataset de travail et un troisième qui traite les données se trouvant dans la variable de travaille pendant que le premier recharge une nouvelle série des données dans le premier dataset.

    Ainsi je gagne de la mémoire et à mon avis, également du temps de traitement puisque des données peuvent être traîtées pendant que la suite est encore en train d'être récupérées.

    J'vous tiens au courant pour savoir si ça marche ^^.

    Griftou.

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    à tous !

    Alors voilà, lda et codage terminés !

    Je veux tester et là, plantage

    Dans mon thread 1 je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    While thread2.isAlive
    End While
     
    ...récupération des données...
     
    thread2.start
    Je pense être en droit de m'attendre à ce qu'il ne lance le thread 2 que lorsqu'il n'est plus en train d'effectuer un quelconque traitement non ?

    Mais j'obtiens l'erreur suivante :

    Thread is running or terminated; it cannot restart.
    A priori je dirais qu'il n'est pas "running" puisque j'attends que "isAlive" soit faux. Donc il reste le terminated mais.... ????????

    J'ai regardé dans la msdn mais j'avoue ne pas avoir vu grand chose qui pourrait m'aider... Ou alors j'ai pas compris

    Donc s'il vous plait... HELP !


    Merci d'avance.

    Griftou.

  6. #6
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut multi thread
    Cette idee d optimisation a l air pas mal du tout... Du coup je pourrai en avoir surement besoin...

    Si tu pouvais nous tenir au courant quand ca marchera...

    Sinon je ne suis pas un pro du multi thread....

    Mais... pourquoi ne pas essayer de voir ce qui ce passe...

    Genre tu te mets un petit msgbox pour l evenement ou le thread s arrete... tu seras vite fixer pour ce probleme la...

    Sinon es ce que tu pourrais montrer la progression du process grace a une progress bar ou un truc comme ca... Tu pourrais suivre en ligne

    (Desole pour la ponctuation, qwerty)

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Alors, en réponse à mon dernier message et pour ceux qui comme moi découvre le multi threading, je viens d'apprendre qu'une fois qu'un thread a terminé son traitement, on ne peut le relancer ! Même si le traitement à faire est le même, il faut instancer un nouveau thread.

    Voilà le pourquoi de l'erreur de mon message précédent.

    Griftou.

  8. #8
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Re-bonjour à tous !

    Comme demandé par mactwist69, je vous tiens au courant de l'avancement du schmilbik.

    Finalement, j'ai eu besoin de 4 threads mais je pense que le 4e est dû à mes besoins propres : nécessité d'écrire dans un fichier et de calculer encore des totaux sur le traitement effectué par le thread n°3 (pour ceux qui ne suivent pas, voir messages précédents).

    Voici les points importants à retenir pour du faire du multithreading d'après ma maigre expérience :

    • Ne pas faire de boucle "while thread.isalive" ; il y a thread.join pour ça
    • Si on veut qu'un thread soit lancé plusieurs fois, il faut faire un new à chaque fois
    • Faire super gaffe à ce que 2 threads n'utilisent pas les mêmes variables au même moment (j'ai lu qu'il y avait des locks pour ça mais bon, s'il y a moyen d'utiliser des variables différentes, autant le faire je pense)

    (j'crois que c'est à peu près tout).

    Et pour répondre à la question de mactwist69, il est tout à fait possible dans mon cas de mettre un contrôle de type ProgressBar car je connais le nombre de jours compris dans l'intervalle de temps demandé et sachant que je fais une requête par jour, je peux tout à fait connaître l'état d'avancement du traitement et le reporter dans un ProgressBar. Après, faut encore voir comment vu que les threads ne peuvent accéder à des composants de l'interface graphique.

    J'espère que ceci en aidera quelques uns.

    Griftou.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Points : 41
    Points
    41
    Par défaut
    Une question pour toi , pour ma culture:
    J'aurais étudié la piste de travailler directement sur la base de données en creant une table temporaire (via procédure stockées ?) contenant les données avant de recuperer par morceau ce dont j'aurais eu besoin.

    Cela te parait-il judicieux ?

  10. #10
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Bin je sais pas trop, je n'ai encore jamais utilisé de procédure stockées

    Mais je me dis que pour créer une table temporaire, tu dois de toute façon faire une requête afin de sélectionner les données que tu veux y mettre. Ensuite, il faut de nouveau accéder à ces données pour pouvoir les traîtées.

    Je peux me tromper mais à priori, j'dirais que c'est un peu faire 2 fois le travail.

    Faudrait voir ce que des gens comme SaumonAgile, Sperot51, Tomlev ou autres (sorry pour ceux que j'ai oublié ) en pense. Je crois que leur opinion sera plus fiable que la mienne.

    Griftou.

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 285
    Points : 99
    Points
    99
    Par défaut
    Bonjour,

    Juste une ptite question à griftou (ou autres ) sur le BackgroundWorker. Comment as-tu fait pour mettre une boule au lieu de la progressbar « classique » ?

  12. #12
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Bin j'ai pris un p'tit gif animé du genre de ce qu'on trouve un peu partout sur le net et j'l'ai foutu sur ma form ^^. Quand le backgroundworker bosse, je l'affiche et je le rend invisible le reste du temps.

    J'espère que j'ai répondu à ta question.

    Griftou.

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

Discussions similaires

  1. Envoyer une grande quantité de données dans un xml via http
    Par qdaemon_fr dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 03/03/2009, 09h51
  2. Manipulation d'une grande quantité de données
    Par sebastyen dans le forum Langage
    Réponses: 1
    Dernier message: 10/11/2008, 15h54
  3. Réponses: 2
    Dernier message: 08/04/2008, 19h11
  4. Une grande quantité de données sur Oracle 8i?
    Par bliml dans le forum Oracle
    Réponses: 13
    Dernier message: 01/03/2007, 11h45
  5. Réponses: 1
    Dernier message: 10/01/2007, 15h52

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