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

PyQt Python Discussion :

Lenteur dans l'importation d'un fichier csv [QtGui]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Par défaut Lenteur dans l'importation d'un fichier csv
    Bonjour,

    Je suis entrain d'écrire une fonction d'importation d'un fichier sous format csv dans une table SQlite3 par 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
    36
    37
    38
    39
     
    with open(fichier_source_csv, 'r', encoding='utf-8-sig', errors='ignore') as csv_file:
    	csv_reader = csv.reader(csv_file, delimiter=';')
    	next(csv_reader)
     
    	nbre_ligne = 0
    	while csv_file.readline(): # Calcul du nombre total de lignes dans le fichier 
    		nbre_ligne += 1
     
     
    requete = QSqlQuery()
    requete.prepare('''DELETE FROM table_clients''') # Vidage de la table
    requete.exec_()
     
     
    with open(fichier_source_csv, 'r', encoding='utf-8-sig', errors='ignore') as csv_file:
    	csv_reader = csv.reader(csv_file, delimiter=';')
    	next(csv_reader)
            nbre_lignes_encours= 1
     
       	while nb_lignes > nbre_lignes_encours:
     
                 for row in csv_reader:
    			id_client = row[0]
    			nom_client = row[1]
    			adresse_client = row[2]
     
    			requete = QSqlQuery()
    			requete.prepare('''INSERT INTO table(id_client, nom_client, adresse_client)
                                                  VALUES(:id_client, :nom_client, :adresse_client)''')
    			requete.bindValue(":id_client", id_client)
    			requete.bindValue(":nom_client", nom_client)
    			requete.bindValue(":adresse_client", adresse_client)
    			requete.exec_()
     
    			self.ui.lineEdit_nbre.setText(str(nb_lignes))
    			self.ui.lineEdit_nbre_encours.setText(str(nbre_lignes_encours))
    			QtCore.QCoreApplication.processEvents()
    			nbre_lignes_encours = nbre_lignes_encours + 1 # Affichage de l'incrémentation de l'importation des données
    Jusqu'à la tout marche, seulement c'est trop lent. Pour 1000 enregistrements ça prend plusieurs minutes. Même en supprimant l'affichage de l'incrémentation le problème demeure toujours.
    Y a t'il une autre solution plus rapide.
    Merci

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 841
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Avant de chercher une autre solution, il convient d'essayer de trouver l'origine du souci. Et donc séparer les actions. Donc commencer par essayer de juste lire le fichier (sans insérer en sql) et voir le temps que ça prend. Puis essayer juste 1000 insertions SQL à partir de données aléatoires (donc prises en RAM et non dans le fichier) et là encore regarder le temps que ça prend. Déjà ça permet de se faire une idée.

    Ensuite (c'est juste un avis personnel) moi je n'aime pas utiliser Qt pour autre chose que ce à quoi il était destiné au départ, c'est à dire de l'IHM. J'aime beaucoup Qt mais aujourd'hui force est de constater que c'est devenu une vraie usine à gaz (je commence même à envisager peut-être de le quitter au profit d'un truc plus léger tel que PySimpleGui ou bien Dear PyGui). Le truc il veut tout faire. De l'IHM évidemment mais aussi du traitement de fichier, du multiprocess, du requêtage bdd et j'en passe. Or généralement un truc qui fait tout déjà c'est lourd et surtout ça ne peut pas tout faire bien. Fatalement il doit y avoir des choses moins optimisées que d'autres.
    Donc j'utilise Qt pour faire mes IHM et quand je veux faire du requêtage bdd, je passe par une librairie Python dédiée à interfacer ma bdd (exemple psycopg2 pour Postgres). Ainsi je reste dans la philosophie MVC en séparant la vue (Qt) du modèle (la bdd).
    Et donc si je dois taper dans du sqlite je passerai par sqlite3 déjà présent en natif dans Python.

    Accessoirement t'es pas obligé d'ouvrir 2 fois ton fichier pour compter ses lignes. Tu peux l'ouvrir, compter puis revenir au début via seek() pour pouvoir le relire.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Citation Envoyé par noureddine1967 Voir le message
    Y a t'il une autre solution plus rapide.
    Déjà lire le fichier CSV une première fois pour compter les lignes ne sert à rien sauf peut être à indiquer à l'utilisateur où çà en est (mais à chaque itération?).

    Si c'est indispensable et que les CSV ne sont pas énormes, on peut les lire en une seule fois.

    Pour aller plus vite vous avez la possibilité d'insérer un groupe de lignes en une seule fois (bulk insert) via .execBatch.

    Dans ce cas, pour indiquer une progression réaliste vous pourriez vous baser sur le ratio entre le nombre de bytes actuellement lus (retournée par .seek) et le nombre d'octets du fichier.

    Comme il y a un appel à processEvents dans la boucle, je suppose que cette lecture se fait dans le même thread que le GUI. Ça serait plus propre de le faire dans un thread séparé (même si çà n'ira pas plus vite).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Par défaut
    Bonjour,

    Tout à bord, excusez moi pour mon retard de vous répondre, j'avais un empêchement.
    Merci les amis pour vos réponses, comme je suis un amateur en programmation j'essaye de prendre des exemples sur le Net et de les réajustés pour mon application.

    Donc commencer par essayer de juste lire le fichier (sans insérer en sql) et voir le temps que ça prend.
    La lecture du fichier ne prend que quelques millièmes de secondes.

    Et donc si je dois taper dans du sqlite je passerai par sqlite3 déjà présent en natif dans Python.
    Vous avez entièrement raison, je voudrais effectué toutes les actions avec PyQt5 et j'oublie que je peut le faire avec sqlite3.

    Je vais essayer de procéder à l'importation du fichier CSV via SQlite3 et de vous tenir informés sur le résultat.

  5. #5
    Membre confirmé
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Septembre 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Algérie

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 148
    Par défaut
    Bonjour,

    Merci encore pour vos conseils, en utilisant SQlite3 à la place de QSqlQuery() le résultat est incomparable.

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

Discussions similaires

  1. [MySQL] Importation d'un fichier csv dans mysql
    Par runcafre91 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/12/2009, 20h55
  2. Importation d'un fichier CSV dans Office
    Par Viggen0020 dans le forum Microsoft Office
    Réponses: 1
    Dernier message: 05/08/2009, 15h48
  3. [XL-2003] Importer automatiquement un fichier CSV dans une feuille
    Par Mikayel dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/06/2009, 10h35
  4. Import d'un fichier CSV dans access par VB
    Par Shoezman13 dans le forum VBA Access
    Réponses: 3
    Dernier message: 18/06/2008, 10h43
  5. Réponses: 1
    Dernier message: 29/04/2008, 12h54

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