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

Bases de données Delphi Discussion :

problème de mémoire


Sujet :

Bases de données Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    838
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 838
    Points : 262
    Points
    262
    Par défaut problème de mémoire
    bonjour,

    je suis en train de récupérer des données d'une base dbase3 vers une base Firebird.

    J'utilise la syntaxe suivante pour faire ses récup:
    (j'utilise le compo table pour la base dbase et le compo IBtable pour la base firebird)

    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
     
    IBTable8.EmptyTable;
    IBtable8.Active:=true;
     
    table8.Active:=true;
     
    table8.first;
    while not table8.Eof do
    begin
     
    IBtable8.Insert;
     
    IBtable8CHAMP1.Value:=table8CHAMP1.Value;
    IBtable8CHAMP2.Value:=table8CHAMP2.Value;
    etc, etc...
     
     
    IBtable8.Post;
     
    table8.Next;
    end;
     
    table8.Close;
    IBtable8.Close;
    ibtransaction1.Commit;
    le code ci dessus se répète 15 fois (il ya 15 tables) et je récupère environ 900 000 enregistrements.

    Tous fonctionne bien mais cela me ralenti le poste a tel point que je suis obligé de le rebooter

    A mon avis il doit y avoir une mémoire tampon, un buffer qui faut vider pas programmation mais je ne sais pas lequel ?

    cordialement

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    as tu pensé à faire un COMMIT tous les x enregistrements à l'aide d'un compteur ?
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Si tu comptes 1 ms par enregistrement, tu montes à 15 minutes pour 900000 ! Avec 10 ms ça monte à 2h30 !

    1 ms ça serait pour MySQL, avec IB, je le trouvais lent, j'utilisais du SQL, en mettant prepared explicitement à true, j'étais passé de 10ms par requête (prepare, execute, unprepare) à 2ms par requête ...
    je pense que l'utilisation de Insert\Post provoque un SQL avec prepare implicite, donc cela perd bcp de temps !

    Voir aussi CachedUpdates, si il est à true, effectivement, tu as un risque de consommer bcp de mémoire !

    Commit ? mais où est le BeginTrans ?



    Comme il n'y a aucun application.ProcessMessages, ton application s'affiche en blanc et "ne répond plus"
    Ajoute un ProcessMessages disons toutes les 1000 lignes (un petit calcul avec GetTickCount permettrait de faire un ProcessMessages toutes les demi-secondes par exemple en affichant un compteur ou barre de progression)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    838
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 838
    Points : 262
    Points
    262
    Par défaut réponse
    bonsoir,

    oups !! je me suis mal expliqué !!

    C'est pas le programme en lui même qui est lent.
    La procédure dure environ 20 minutes et tout se passe bien.

    mais c'est après: une fois que ce programme est fermé, le poste informatique devient très lent à un point ou je suis obligé de le rebooter.

    A+

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    J'aurais tendance a dire comme Olivier . Le commit de ta transaction ne se fait qu'a la fin du programme (ou du moins du transfert de la table entière) si j'ai bien lu le programme . Ton PC est ralenti car c'est ton serveur Firebird qui fait son boulot (Commit) .

    Je suis toujours parti d'un principe : Faire des transactions courtes (1 insert, 1 commit) .

    as tu pensé a datapump ou aux tables externes de Firebird tuto
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. [WORD]Problème de mémoire
    Par Dnx dans le forum VBA Word
    Réponses: 17
    Dernier message: 05/10/2005, 14h48
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [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
  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