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 :

probleme de mémoire


Sujet :

Bases de données Delphi

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 839
    Points : 262
    Points
    262
    Par défaut probleme de mémoire
    Bonjour,

    je fait l'import/export d'une base dBase vers une base firebird en utilisant le code suivant:


    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
    29
    30
    31
    32
    33
    34
    35
     
    IBtransaction1.Active:=true;
     
    IBTable4.EmptyTable;
    IBtable4.Active:=true;
     
    table4.Active:=true;
     
    table4.first;
    i:=1;
     
    while not table4.Eof do
    begin
     
    IBtable4.Insert;
     
    IBtable4champ1.Value:=table4champ1.Value;
    IBtable4champ2.Value:=table4champ2.Value;
    IBtable4champx.Value:=table4champx.Value;
    /
    /
    /
    IBtable4dernierchamp.Value:=table4dernierchamp.Value;
     
    IBtable4.Post;
    inc(i);
     
    if i mod 500=0 then  ibtransaction1.CommitRetaining;
     
    table4.Next;
    end;
     
    ibtransaction1.Commit;
    table4.Close;
    IBtable4.Close;
    Il y a environ 230000 lignes et cela fonctionnait bien jusqu'a maintenant, mais aujourd'hui j'obtient une erreur système:

    "unable to allocate memory from operating system"

    Auriez une astuce pour solutionner ce problème ?

    cordialement

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Je suppose que ibtransaction1 est lié via IBtable4.Transaction
    Tu n'as pas perdu le lien entre les deux ?

    Ajoute un try except, ajoute une variable entière, et tu affecte une valeur à cet entier avant chaque opération majeure, tu pourras repérer l'erreur
    souvent en débogage cela fausse ce genre de diagnostique d'où l'utilisation d'un marquage !

    dans le except, tu affiche l'entier, ensuite tu affines jusqu'à trouver la ligne problématique (si elle ne change pas à chaque essai )
    N'hésite pas à faire cela dans un projet tout neuf ne contenant que ça !
    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

  3. #3
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    Quelle version de Firebird ?
    Composants IBX avec Firebird, hum...
    La transaction est elle bien gérée ?
    Citation Envoyé par looping Voir le message
    Auriez une astuce pour solutionner ce problème ?
    1) La base serait-elle corrompue ? cf. Doc
    gfix -validate -full

    2) Eviter les IBTable et utiliser un IBQuery paramétré
    ou plutôt
    Eviter les IBTable et utiliser un IBScript
    ou
    Utiliser des composants autres que IBX (dbExpress, UIB)
    --
    Philippe.
    Philippe.

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

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

    En m'aidant des infos de ShaiLeTroll j'ai fini par trouver quelque chose.

    j'ai observé que l'import/import se bloquait après 225096 enregistrements.
    Après divers essais (suppression d'enregistrement, de champ ) j'ai fini par arrivé à la conclusion suivante: c'est un champ type blob qui bloquait tout !


    Et comme ce champ était à la valeur NULL pour toute la table, je l'ai supprimé de l'import/export.
    Et maintenant tout refonctionne, les 234647 lignes sont exportées correctement.

    Par contre je ne m'explique pas le pourquoi ? Est ce que c'est le fait que tout les enregistrement soientt NULL qui pose problème ?

    Concernant les composants, c'est bien en IBX. Je sais c'est pas optimun, mais c'est un programme qui n'est que temporaire.

    merci

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par looping Voir le message
    Concernant les composants, c'est bien en IBX. Je sais c'est pas optimun, mais c'est un programme qui n'est que temporaire.
    tant qu'a faire tu n'avais qu'a utiliser BDE pour les 2

    le problème c'est que tu utilises des variants
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IBtable4champ1.Value:=table4champ1.Value;
    et avec les mémos ça passe mal
    si pour le champ mémo tu avais forcé en string je pense que tu n'aurais eu aucun soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IBtable4champMemo.asString:=table4champMemo.asString;
    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

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    839
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 839
    Points : 262
    Points
    262
    Par défaut test
    Bonjour,

    j'ai viré tous les champs inutiles pour ne garder que le champ clé et le champ memo.

    soit
    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
     
    IBtransaction1.Active:=true;
     
    IBTable4.EmptyTable;
    IBtable4.Active:=true;
     
    table4.Active:=true;
     
    table4.first;
     
    while not table4.Eof do
    begin
    IBtable4.Insert;
    IBtable4champcle.Value:=table4champcle.Value;
    IBtable4champmemo.asstring:=table4champmemo.asstring;
    IBtable4.Post;
     
    table4.Next;
    end;
     
    ibtransaction1.Commit;
    table4.Close;
    IBtable4.Close;
    résultat identique: arrêt à la ligne 225096 avec le méssage "unable to allocate memory from operating system"

    Vraiment étonnant !!
    Pour information, j'utilise ce programme 1 fois par semaine depuis 6 mois et je n'avais pas eu de problème jusqu'a aujourd'hui

    Il y a en tout 1 000 000 d'enregistrements répartis sur 30 tables avec 450 champs;dont 25 autres champs memo où je n'ai pas de problème.
    Cette table là est la plus grande, d'où je pense le problème ? (les autres n'excedent pas 50000 lignes)

    C'est bon que je peux supprimer ce champ dans ce cas vu qu'il est à null, mais si cela m'arrive avec une table ou je dois impérativement l'importer

    J'ai essayé avec un poste Windows 7 qui a plus de memoire mais c'est le même résultat .

    cordialement

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Au lieu d'utiliser un IBTable, passe par un IBQuery avec une requête insert.
    Car la a chaque enregistrement que tu ajoutes t'as mémoire augmente alors qu'avec un IbQuery, c'est juste la base de données qui augmentera.

    Les xxxTable c'est à bannir surtout sur des traitements lourd comme celui la.
    (BDE c'est aussi à bannir, vu que c'est obsolète depuis plus de 10 ans)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/11/2007, 18h02
  2. probleme de mémoire
    Par beLz dans le forum C
    Réponses: 6
    Dernier message: 10/07/2007, 21h05
  3. probleme de mémoire : Java heap space
    Par Seb33300 dans le forum Interfaces Graphiques en Java
    Réponses: 10
    Dernier message: 21/02/2007, 13h40
  4. Réponses: 1
    Dernier message: 16/01/2007, 10h21
  5. Probleme de mémoire avec FireBird
    Par NicolasR dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/05/2006, 16h28

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