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

Python Discussion :

optimisation lecture fichier .txt


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Par défaut optimisation lecture fichier .txt
    Bonjour,
    Dans le cadre d'un développement d'extension QGIS (Python 2.7, librairies PyQt4), j'ai besoin de lire plusieurs (essentiellement 2) énormes fichiers .txt (environ 140 Mo) pour les intégrer dans une base de données.
    Voici le code utilisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fichier = open(unicode(pathFichier), "r")
    	for ligne in fichier:
    		ligne = ligne.decode('utf8')
    		chaines = ligne.split(";")
                    """ puis traitement des différents éléments de chaines"""
    Y aurait il une possibilité moins gourmande en temps? J'ai cru comprendre que Python mettait déjà le fichier en mémoire cache lorsque qu'il l'ouvre dans "fichier".
    Comment optimiser la lecture pour un très gros fichier?

    Merci.

  2. #2
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Salut,

    Citation Envoyé par maudJ Voir le message
    Bonjour,
    Y aurait il une possibilité moins gourmande en temps?
    Une première possibilité serait de mettre chaque ligne de ton fichier dans une liste ou dans un dictionnaire.
    Pour choisir entre liste ou dictionnaire, faudrait savoir ce que tu traite comme données.
    Ensuite tu parcours cette liste ou ce dico pour traiter tes chaines.

    Comment optimiser la lecture pour un très gros fichier?
    Je pense que cela dépend de tes données.
    Dans des cas que j'ai traités avec des fichiers de plus centaines de milliers de lignes, je transférais tout mon fichier dans un tableau et ensuite je travaillais sur le tableau, alors qu'au départ je travaillais directement lignes par lignes depuis mon fichier, le temps c'est vue être diviser par 5.
    Ensuite tout dépend également de la machine sur laquelle ton script va tourner, et si tu es en 32bits ou en 64bits.

  3. #3
    Membre averti
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Par défaut
    Merci pour cette info. Voici le traitement que je fais des données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	#traitement
    	if nbCh>=5 and self.verifTableGen(chaines[1], chaines[2]):
    			if nbCh == 5:
    				chaines.append(0)	
    			listDonnees.append((nbEnreg, chaines[1], chaines[2], chaines[3], chaines[4], chaines[5]))
                            nbEnreg += 1
    en gros je récupère des données que j'insère dans une liste pour former les valeurs nécessaire à l'insert de sqlite.
    verifTableGen vérifie que les premières données sont bien dans la base de donnée. Le fichier fourni a chaque ligne commençant par un ; c'est pourquoi je commence à 1 la lecture.
    Je pense que l'utilisation d'une liste serait mieux vu ce que j'en fais ensuite, non?

  4. #4
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par maudJ Voir le message
    Merci pour cette info. Voici le traitement que je fais des données:
    Je pense que l'utilisation d'une liste serait mieux vu ce que j'en fais ensuite, non?
    C'est à vous de faire le test et constater s'il y a une amélioration ou pas.

  5. #5
    Membre expérimenté

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Par défaut
    Bonjour,

    En principe, les ETL (logiciel couramment utilisé dans ce genre de tâches) ne mettent pas la totalité du fichier en mémoire. Ils travaillent par séquence (nombre de ligne), un peu comme du streaming, bout par bout. Par contre, cela n'est envisageable que si vous n'avez pas à faire de traitement bloquant sur vos données. Par exemple, si vous devez faire un tri ou une agrégation, obligatoirement vous devez récupérer la totalité des données.

    Vous pourriez peut être envisager le traitement puis l'insertion des données à chaque ligne, en itérant notamment avec yield (générateur), cela résoudra vos problèmes de mémoire, un exemple ici : http://sametmax.com/comment-utiliser...urs-en-python/

    Vous avez également deux articles sympathiques ici http://www.chicoree.fr/w/Lire_et_%C3...te_avec_Python et ici http://www.chicoree.fr/w/Fichiers_CSV_en_Python.

    Avec sqlite, je ne sais pas, mais avec de vraies base de données, on peut faire des insertions en masse (bulk insert), par exemple pour sql server : https://msdn.microsoft.com/fr-fr/lib...=sql.120).aspx

  6. #6
    Membre averti
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Par défaut
    Bonjour,
    Merci pour ces réponses. Vu ce que je fais des données en fait le plus efficace serait d'importer directement un fichier csv dans ma table sqlite.
    Problème: je suis en Python 2.7 et toutes les aides concernant cette manip indique python 3. Serait-ce qu'il n'est pas possible de le faire en Python 2.7?

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 745
    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 745
    Par défaut
    Salut,

    Citation Envoyé par maudJ Voir le message
    Merci pour ces réponses. Vu ce que je fais des données en fait le plus efficace serait d'importer directement un fichier csv dans ma table sqlite.
    Problème: je suis en Python 2.7 et toutes les aides concernant cette manip indique python 3. Serait-ce qu'il n'est pas possible de le faire en Python 2.7?
    "importer directement un fichier csv dans ma table sqlite" se fait avec des commandes du shell sqlite (pas besoin de Python)... poster au moins une URL qui décrit ce dont vous parlez aiderait à comprendre ce que vous racontez.

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

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

Discussions similaires

  1. optimiser lecture fichier image
    Par cheho dans le forum C++
    Réponses: 17
    Dernier message: 15/09/2006, 14h14
  2. lecture fichier txt
    Par stephaneamadeus dans le forum C
    Réponses: 8
    Dernier message: 28/04/2006, 18h47
  3. Lecture fichier txt
    Par licorne dans le forum C
    Réponses: 3
    Dernier message: 03/04/2006, 17h14
  4. Optimiser traitement fichier [.txt]
    Par Metallic-84s dans le forum Langage
    Réponses: 14
    Dernier message: 16/03/2006, 13h33
  5. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08

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