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

InterBase Discussion :

Erreur memoire insuffisante


Sujet :

InterBase

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 48
    Points
    48
    Par défaut Erreur memoire insuffisante
    version interbase : 6.5
    logiciel utilisé : borland 2007
    But de mon application : effectué une mise a jour des table de chaque client donc en faisant une recherche dans une bdd principale pour en extraire les enregistrement propre au client et insérer les enregistrement corespondant dans une bdd propre au client sachant que donc chaque client a sa propre bdd


    Voila, j'ai converti mes bdd il y a pas très longtemp de paradox vers interbase et je suis confronté a un problème qui survient a un moment de mon application.
    en faisant plusieur test, cette erreur de "mémoire insuffisante" apparait a plusieur moment :

    - j'ai une tâble qui compte environ 1 900 000 enregistrement et arrivé a un stade précis , soit a l'enregistrement 1'296'999 , cette erreur survient et plante mon appli .... mystère

    - ensuite je fais un test sur plusieur table a la suite ( ce que fera l'application final) , ses tâbles ayant beaucoup moins d'enregistrement.
    donc en gros j'insère des enregistrement sur une table1, puis sur une table2 etc ... et arrivé a une certaine table sa plante et ca me met cette erreur !!

    je met donc la ligne en commentaire ( je fais appel a une fonction et lui passe en paramètre le nom de la table etc ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool CopierFournisseur(AnsiString NomClient,AnsiString TableName,int NumField,TStringList * liste,AnsiString repertoire);
    ... et la ca marche !!

    j'aimerais donc savoir si quelqu'un pouvais m'éclairer pasque je me demande déja si d'une part Interbase pouvais supporté des bdd avec des tâble assez grosse ( ma plus grosse table faisant environ 2M d'enregistrement les autre sont < 400 000 enregistrements)

    ou si cela vient d'une mémoire cache quelconque ?
    j'ai vérifié la ram du pc en lancant le gestionnaire des tâche mais ils n'est même pas saturé alors je n'y comprend rien ...

    je vous remercie par avance de vos lumière

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Tu fais des commits de temps en temps lors de la recopie ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    des commit ? tu veux dire avec la TIBTransaction ?
    pas pour l'instant je fais un simple Insert / post mais c'est tout et je sais pas si justement il n'y a pas un truc a faire avec le composant de transaction

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    mm .... maintenant que tu m'a parler de commit ..

    sur ma bdd de destination j'y avais associé une TIB transaction avec :
    AutoStopAction = saCommit
    DefaultAction = TaCommit
    et Params avec :
    user_name=SYSDBA
    password=masterkey.

    j'ai modifié les 2 première propriété en :
    AutoStopAction=saCommitretaining
    DefaultAction=taCommitRetaining

    et bizarement je n'ai plus l'erreur .... était ce ca qu'il falliat modifié ? et quel est la différence entre Commit et CommitRetaining ?

  5. #5
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Un peu de lecture sur le sujet http://www.developpez.net/forums/sho...d.php?t=479370

    Il faudrait aussi voir comment tout ceci est codé.

    En effet, sans commit, la trace de chaque modif est journalisée (pour permettre le rollback en cas de pb). Et évidemment, la journalisation n'est pas gratuite en terme de ressources machines. Alors, au bout d'un moment, bah y a plus de ressources...

    De fait, cette belle mécanique marche bien car dans une transaction, on modifie rarement plus d'une dizaine de lignes. Ensuite soit c'est ok et on commite, soit c'est ko et c'est le roolback. Mais dans tous les cas, les ressources de journalisation liées aux modifs sont libérées.

    Là, 1 million++ de modifs dans 1 transaction
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 48
    Points
    48
    Par défaut
    bah en fait je fais surtout des insertions .... j'ai mis la propriété a "commitretaining" même si c'est un peu confus pour moi mais ca marche bien pour l'instant et c'est même plus rapide qu'avec la version paradox/ADO ^^ mais bon l'utilisation du SQL y est surement pour quelquechose ^^.
    peut être devais-je validié mon commit a chaque fois que j'insérais une ligne dans ma bdd mais je trouverai surement des informations sur le net

    edit : je viens de voir le lien que tu m'as montré et ca me laisse perplexe tout ca ... étant donnée que j'ai une table a 2M d'enregistrement ca voudrait dire qu'avec un commit retaining j'aurai des risque de perdre des donnée ?

    aussi, lorsque je faisait un commit, il ne me semble pas avoir appelé de fonction Commit ou quelquechose du genre .. mais ou faut-il que j'appelle cette fonction ( si je la trouve sous borland ^^).

    pasque pour l'insertion j'utilise un TIBTable , je sais que c'est pas plus rapide que le SQL d'après ce que j'ai entendu mais je fais simplement un Insert() / Post, ca doit sûrement ralentir un peu l'application mais pour l'instant c'est assez rapide je trouve maus il faut que je le fasse ou le commit ? après la fonction Post() ? ce qui voudrait dire que j'aurai autant de commit que d'enregistrement pour chaque table ... donc j'ai bien peur que ca sature complètement le serveur par la suite ....


    edit : voila, après avoir regarder les différent sujets sur les transactions je comprend beaucoup mieux comment cela fonctionne.
    donc si je comprend bien , a chaque fois que j'ai besoin d'insérer ou modifier des enregistrements sur une table, il me suffit de faire la syntaxe ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IBTransaction->StartTransaction()
     
    ..... traitement
     
    IBTransaction->Commit()
    ce qui permettra de validé la transactions une fois la tâche fini et ainsi de libérer la mémoire cache de interbase .... mais cela marche pour des petite tâbles ...

    pour ma tâble de 2M d'enregistrement j'ai 2 solutions :
    - soit je change la propriété de mon composant IBTransaction en CommitRetaining et la j'ai aucun problème
    - soit je laisse en Commit, mais je balance un compteur qui, par exemple arrivée a 1M d'enregistrement, valide la transaction pour libérer la mémoire cache et en relance une autre par derrière ... je ne l'ai pas encore testé mais je pense que cela dois marché.

    par cointre quel est le meilleur choix ? faire un commit sur de petite tâble et un commiRetaining sur la grosse ou bien faire un commit retaining sur toute les tâbles ?

Discussions similaires

  1. [Débutant] VB.NET erreur (memoire insuffisante)
    Par s080s dans le forum VB.NET
    Réponses: 12
    Dernier message: 05/08/2014, 19h17
  2. Excel erreur memoire insuffisante
    Par Noddles dans le forum Débuter
    Réponses: 0
    Dernier message: 06/01/2013, 15h43
  3. D2010 - Erreur memoire insuffisante
    Par SergioMaster dans le forum EDI
    Réponses: 4
    Dernier message: 21/07/2011, 13h57
  4. Probleme VB6 et erreur 7 memoire insuffisante
    Par dubidon dans le forum Windows
    Réponses: 3
    Dernier message: 31/05/2006, 11h04
  5. [VB6] Erreur 7 memoire insuffisante ??
    Par dubidon dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 31/05/2006, 11h03

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