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 :

Récuperer les données d'un fichier txt pour les insérer dans une Table


Sujet :

Bases de données Delphi

  1. #21
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par sandokhane Voir le message
    Non y a aucun bug....et les données sont toutes postées sans aucun problème..
    Malheureusement le problème de la lenteur existe toujours puisque l'opération du parsing du fichier texte prend beaucoup de temps.
    1 - Ca donnait quoi en terme te temps avant tes modifs...histoire d'avoir une idée de ce que tu as "gagné"
    2 - Tu es sûr que la lenteur vient du parsing et pas de l'insersion dans la base? Peux-tu nous dire ce que ça donne - comme temps - si tu désactives tout le code qui insère les données dans la base?
    Pensons bien, pensons bio

  2. #22
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par samaury Voir le message
    1 - Ca donnait quoi en terme te temps avant tes modifs...histoire d'avoir une idée de ce que tu as "gagné"
    2 - Tu es sûr que la lenteur vient du parsing et pas de l'insersion dans la base? Peux-tu nous dire ce que ça donne - comme temps - si tu désactives tout le code qui insère les données dans la base?
    ---> Avec ta méthode ç-à-d le post en dehors de la boucle.. j'ai gangné 2 secondes... voir les résultats plus haut..

    ---> J'ai dis le parsing...car avant l'opération d'insertion des données dans la table je fait la copie de toutes le enregistrements de cette table dans une autre table archive.... cette dernière opération ne prend que 15 secondes.

  3. #23
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    A priori, tu insères 100 000 enregistrements dans une table, 2 min ne me sembles pas si élévé que ça. Essaye avec une autre BDD, firebird par exemple, autrement dit teste le code sur plusieurs BDD pour faire la comparaison.

  4. #24
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par chaplin Voir le message
    A priori, tu insères 100 000 enregistrements dans une table, 2 min ne me sembles pas si élévé que ça. Essaye avec une autre BDD, firebird par exemple, autrement dit teste le code sur plusieurs BDD pour faire la comparaison.
    qui a parlé de cent mille enregistrements.. on est qu'a 4324 enregistrements où chaque enregistrements contient 12 champs...

  5. #25
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Citation Envoyé par sandokhane Voir le message
    j'ai essayé la méthode sur un fichier de 8Mo de données... ça marche mais l'opération d'insertion des données dans la table est très très lente....donc la question se pose... est-ce qu'il y a un remède pour accélérer le traitement des Strings et les insérer dans la Table ?
    - 8 Mo = 8 000 000 Octets
    Citation Envoyé par Fxg Voir le message
    A ouvrir avec un éditeur de texte et là on voit que le prmeier 'champ' est sur 3 caractère puis le deuxième sur 49 caractères et le dernier sur 20 caractères
    Taille d'un enregistrement:
    - 3+49+20=72
    Nombre d'enregistrements:
    8 000 000/72 ~ 100 000

    Désolé, j'ai rien du comprendre à tes explications, j'ai pas regardé ce qu'il y avait dans le fichier de 8Mo.

  6. #26
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par chaplin Voir le message
    - 8 Mo = 8 000 000 Octets

    Taille d'un enregistrement:
    - 3+49+20=72
    Nombre d'enregistrements:
    8 000 000/72 ~ 100 000

    Désolé, j'ai rien du comprendre à tes explications, j'ai pas regardé ce qu'il y avait dans le fichier de 8Mo.
    ... très intelligent de ta part..

  7. #27
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    sauf que forme.txt fait 23ko et que c'est le fichier medic.txt qui fait 8 mo avec beaucoup plus de champs...........et donc plus d'opération d'insertions.
    Les performances ne me semblent pas non plus aberrantes sur ce fichier.

  8. #28
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    Ton problème ne viendrait pas plutôt de l'affichage? Dans tes premiers messages je vois que tu fais des "Memo1.Lines.Add('.....');" Je suppose que tu ajoutes les données que tu parses dans un TMemo, ce qui ralenti ton process.
    Cf projet test ci-joint. Je l'ai testé avec ton fichier medic.txt et je passe de 400ms sans affichage des données 14 s avec l'affichage.
    Cela dit, je n'ai pas intégré l'insertion des données dans une base mais c'est déja une piste.
    Fichiers attachés Fichiers attachés
    Pensons bien, pensons bio

  9. #29
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par samaury Voir le message
    Ton problème ne viendrait pas plutôt de l'affichage? Dans tes premiers messages je vois que tu fais des "Memo1.Lines.Add('.....');" Je suppose que tu ajoutes les données que tu parses dans un TMemo, ce qui ralenti ton process.
    Cf projet test ci-joint. Je l'ai testé avec ton fichier medic.txt et je passe de 400ms sans affichage des données 14 s avec l'affichage.
    Cela dit, je n'ai pas intégré l'insertion des données dans une base mais c'est déja une piste.

    oui .. je voix c'est une remarque très importante...moi j'insère directement les données dans la Table.

    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
     
       //////////// Medic.txt
      AssignFile(F,ExtractFilePath(Application.ExeName)+'Medic.txt');
      Reset(F);
      repeat
      Readln(F,Stg);
      N_Enregistrement:=copy(stg,1,5);
      Nom_commercial:=copy(stg,6,49);
      Nom_DCI:=copy(stg,56,49);
      Dosage:=copy(stg,106,28);
      Unite:=copy(stg,136,19);
      Conditionnement:=copy(stg,156,20);
      Remboursable:=copy(stg,176,1);
      Date_remboursement:=Copy(Stg,178,8);
      date_arret_remboursement:=Copy(Stg,186 ,8);
      Tarif_de_reference:=copy(stg,194,20);
      Forme:=copy(stg,216,6);
      Observation:=copy(stg,243,1000);
    //// insertion des données
      DataModule2.ABSTable1.AppendRecord([nil,N_Enregistrement,Nom_commercial, Nom_DCI, Dosage, Unite,  Conditionnement, Remboursable,Tarif_de_reference, Forme, Observation]);
      DataModule2.ABSTable1.Edit;
      DataModule2.ABSTable1Date_remboursement.Value:=Date_remboursement;
      DataModule2.ABSTable1Date_arret_remboursement.Value:=date_arret_remboursement;
     
    //// Fin de l'insertion
      Update;
      until EOF(F);
      DataModule2.ABSTable1.Post;
      CloseFile(F);
    .... Pour l'affichage des données j'utilise un simple DBGrid..je sais que ça affecte les performances..mais je n'en peux m'en passer car c'est important pour visualiser la progression de l'opération.

  10. #30
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Pourquoi tu fais un AppendRecord suivi d'un Edit ?

    AppendRecord effectue l'insertion (Append) remplit les champs avec le tableau transmis et valide le tout (Post).
    Ne peux-tu pas transmettre Date_remboursement et date_arret_remboursement avec le AppendRecord ?

    @+

  11. #31
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    Les ajouts dans les memos sur mon premier message étaient juste là pour visualiser le découpage du fichier.

    Pour le dbgrid il faut le "débranché" avant l'insertion de toutes les données puis le reconnecter après.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    with DataModule2.ABSTable1 do
    begin
    DisableControls;
    ...
    ...
    ....
    EnableControls;
    end;
    A vérifier.

  12. #32
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Salut

    Pourquoi tu fais un AppendRecord suivi d'un Edit ?

    AppendRecord effectue l'insertion (Append) remplit les champs avec le tableau transmis et valide le tout (Post).
    Ne peux-tu pas transmettre Date_remboursement et date_arret_remboursement avec le AppendRecord ?

    @+
    parce que la procédure AppendRecord ne support pas plus de 10 (ou 11) champs à la fois.... ça c'est selon mon experience...j ne sais pas si c'est limitation ou autres chose...

  13. #33
    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
    Citation Envoyé par sandokhane Voir le message
    parce que la procédure AppendRecord ne support pas plus de 10 (ou 11) champs à la fois.... ça c'est selon mon experience...j ne sais pas si c'est limitation ou autres chose...
    Il vaudrait mieux, alors, que tu vire le AppendRecord et que tu fasses un Append/insert avec la liste des champs, tu gagneras en temps de traitement.
    Modérateur Delphi

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

  14. #34
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Il vaudrait mieux, alors, que tu vire le AppendRecord et que tu fasses un Append/insert avec la liste des champs, tu gagneras en temps de traitement.
    non ..non ...j'ai déjà essayé... ça prend beaucoup plus de temps...

  15. #35
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Fxg Voir le message
    Les ajouts dans les memos sur mon premier message étaient juste là pour visualiser le découpage du fichier.

    Pour le dbgrid il faut le "débranché" avant l'insertion de toutes les données puis le reconnecter après.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    with DataModule2.ABSTable1 do
    begin
    DisableControls;
    ...
    ...
    ....
    EnableControls;
    end;
    A vérifier.
    ... oui j'ai pensé à ça...et ça m'a fait gagné presque 30 secondes sur mon fichier de 8Mo...mais du point de vue esthétique...c pas bon a voir...puisqu'on a aucune indication sur la progression de l'opération.

  16. #36
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    Dans ce cas tu rajoute un progressBar

    Si je compte bien on doit être autour de la minute maintenant ?

    De toute façon cela ne sera jamais instantané

  17. #37
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Fxg Voir le message
    Dans ce cas tu rajoute un progressBar

    Si je compte bien on doit être autour de la minute maintenant ?

    De toute façon cela ne sera jamais instantané
    oui.. exactement 1' 20'' ....
    Est-ce que t'as une idée comment définir les bornes d'un progressBar dans ce cas...d'habitude j'utilise min=0 et max=RecordCount-1... mais dans cette situation on connait pas le nombre d'enregistrements de la Table.

  18. #38
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Ton fichier forme.txt fait 22349 octets.
    Chaque ligne fait 74 octets (3 + 49 + 20 + 2 (CR/LF))

    22349 div 74 = 302.

    Ton "RecordCount" est de 302.

  19. #39
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Ton fichier forme.txt fait 22349 octets.
    Chaque ligne fait 74 octets (3 + 49 + 20 + 2 (CR/LF))

    22349 div 74 = 302.

    Ton "RecordCount" est de 302.
    Waw c de la science exacte...




  20. #40
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Je vous remercie Cl@udius....
    pour le fichier medic.txt (de 8Mo) c un peu difficile de connaitre la dimension d'une ligne en octets....donc on fait l'opération à l'envers....
    -- on la taille du fichier : 8 656 648 octets
    -- Le nombre de lignes : 4324 (notepad++)
    --> Dimension d'une ligne = 8 656 648 div 4324 = 2002 octets.

    Et en fin pour dynamiser le calcul on peut utiliser la fonction GetFileSize pour calculer la taille du fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProgressBar1.max := GetFileSize(Chemin_du_fichier) div 2002

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/05/2014, 23h01
  2. [XL-2007] Récuperer les données d'un fichier et traiter les données
    Par kekefff dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/05/2014, 20h29
  3. [OpenOffice][Base de données] Récupérer les données d'un fichier .txt et les insérer dans une base de données
    Par frack dans le forum OpenOffice & LibreOffice
    Réponses: 9
    Dernier message: 05/08/2009, 10h52
  4. Réponses: 2
    Dernier message: 20/07/2008, 11h29
  5. Importer fichiers txt d'un dossier dans une table
    Par avantoux dans le forum Access
    Réponses: 16
    Dernier message: 28/12/2005, 12h13

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