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 :

Python 2.7 et SQlite3 MemoryError


Sujet :

Python

  1. #1
    Membre confirmé
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Par défaut Python 2.7 et SQlite3 MemoryError
    Bonjour,

    j'ai créé une base de données SQlite afin d'y intégrer des données qui m'arrivent dans des fichiers XML.

    Ces fichiers sont parfois volumineux (ils vont de 20 à 150Mo)
    Avec SAX, je réupère les valeurs des données des fichiers XML, que je stocke dans un Gtk.ListStore()
    j'arrive à faire tout ça même pour des fichiers très gros (jusqu'à 150Mo)

    Jusque là aucun soucis.

    Par contre quand je commence à intégrer les données du Gtk.ListStore dans la base SQLite, avec curBDD.execute(expressionSQL),
    au bout de 42100 et quelques enregistrements, il se produit une erreur MemoryError

    Je précise que j'ai essayé de faire ceci : tous les 100 enregistrements ajoutés je ferme le curseur et déconnecte la base de données, puis je la reconnecte.

    Mais j'ai toujours cette erreur

    Quelqu'un a t il une idée?

    Merci

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

    Citation Envoyé par katanaenmousse Voir le message
    Ces fichiers sont parfois volumineux (ils vont de 20 à 150Mo)
    Avec SAX, je réupère les valeurs des données des fichiers XML, que je stocke dans un Gtk.ListStore()
    j'arrive à faire tout ça même pour des fichiers très gros (jusqu'à 150Mo)
    Vous utilisez SAX pour ne pas devoir charger toutes les données en mémoire. C'est une très bonne idée lorsqu'on a à traiter de gros fichier XML... mais si vous stockez néanmoins les données en mémoire via Gtk.ListStore(), vous n'êtes pas très cohérent: vous devriez pouvoir écrire les données dans sqlite au fur et a mesure de leur lecture via SAX sans avoir a les stocker "au milieu".

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

  3. #3
    Membre confirmé
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Par défaut
    Salut Merci pour cette reponse En realite je charge toutes les donnees dans un gtk.liststore pour les afficher ensuite dans un treeview C est pour ca que je les stocke avant de les ecrire en base J ai tout de meme changė ma facon de faire en suivant vos conseils : 1 Je lis le fichier avec sax et j ecris directement un enregistrement dans la base sans le stocker dans le gtk.liststore 2 une fois les enregistrements charges en base je fais une requête sql de tous mes enregistrements et je stocke le résultat dans un gtk.liststore que j associe ensuite à mon treeview Et la tout fonctionne, pourtant je mets autant de donnees dans le treeview même plus! Ça buggait à 41000 la j en ai 90000 et tout va bien Je comprends pas trop pourquoi... Quelqu un à une idée?

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

    Citation Envoyé par katanaenmousse Voir le message
    Et la tout fonctionne, pourtant je mets autant de donnees dans le treeview même plus! Ça buggait à 41000 la j en ai 90000 et tout va bien Je comprends pas trop pourquoi... Quelqu un à une idée?
    Peut être que çà laisse plus de mémoire disponible pour ListStore/TreeView.
    Dans tous les cas, lorsqu'on doit afficher ou traiter beaucoup de données, on évite d'avoir tout à charger en mémoire: on les charge "à la demande", en fonction des besoins (de ce qui doit être affiché).

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

  5. #5
    Membre confirmé
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Par défaut
    ok, par contre j'ai une erreur assez étrange avec SAX.
    Je précise que le XML fait 95Mo

    En gros je recupère la valeur de plusieurs éléments à tour de role avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def characters(self,ch):
            self.valeur=ch
    tout se passe bien pendant plusieurs milliers d'enregistrements et puis au bout d'un moment je n'ai plus que des morceaux de la chaine de caractères et cela pour un seul élément, tous les autres continuent normalement

    Normalement cette valeur est "original" ou vide et parfois j'obtiens "inal" ou "nal" ou un autre morceau de la chaine.

    j'avoue que je ne comprends pas pourquoi, surtout que cela marche pour plusieurs autres milliers d'enregistrements.

    Quelqu'un aurait une piste?

  6. #6
    Membre confirmé
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Par défaut
    J'ai trouvé après avoir un peu analyser ce que me renvoyait SAX.

    Sax renvoie la valeur d'un élément mais pas forcément en une seule chaine de caracteres ni en une seule fois.

    Il faut donc modifier le code comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def characters(self,ch):
            # SAX renvoie ici la valeur d'un élément (pas forcément complet) 
            self._charBuffer.append(ch.encode("utf-8"))    
     
             #self.valeur=(ch.encode("utf-8"))  cette ligne est fausse la  valeurd'un élément peut etre renvoyé en plusieurs ch successifs
    Pour avoir la valeur complète on concatene les renvois successif et on passe par une methode: j ai choisi : valeur_elem() pour l'obtenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def valeur_elem(self):
            s = ''.join(self._charBuffer)
            self._charBuffer = []
            return s
    pour afficher la valeur je n'ai plus qu'à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print self.valeur_elem()
    voila
    merci pour votre aide

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

Discussions similaires

  1. python 2.6 / 2.7 et sqlite3 : requête
    Par antoinev2 dans le forum SQLite
    Réponses: 0
    Dernier message: 19/09/2011, 14h13
  2. Comment moderniser le sqlite3 du Python 2.6.5 ?
    Par tyrtamos dans le forum Général Python
    Réponses: 3
    Dernier message: 18/08/2010, 08h16
  3. [python 2,6] [sqlite3] (sqlAlchemy?)
    Par antoinev2 dans le forum Général Python
    Réponses: 12
    Dernier message: 02/10/2009, 00h05
  4. [source][python 3.0]client sqlite3
    Par vincent.mbg dans le forum Contribuez
    Réponses: 3
    Dernier message: 11/09/2009, 16h51

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