2010-10-01 4 views
2

Comme je l'ai indiqué dans this question il y a quelque temps, j'ai des problèmes de performance lors de l'accès à une base de données sqlite à partir de Python. Pour que cela soit clair une fois de plus, le code identique s'exécute plus de 20 fois plus vite en utilisant apsw. J'ai récemment installé une version différente de Python en parallèle et installé une nouvelle version de apsw pour cela. Cette version a fonctionné lentement aussi. J'ai essayé le même code sur un autre ordinateur en utilisant pythons built-int sqlite3, et il a couru rapidement (mais lent avec APSW). J'ai également essayé d'installer la version la plus récente de pysqlite sur mon ordinateur, mais cela a fonctionné lentement.Comment diagnostiquer la raison de l'accès lent à la base de données sqlite?

Je suis absolument certain que ce n'est pas un problème avec le schéma.

Ma question est maintenant, comment puis-je procéder pour diagnostiquer l'erreur?

Répondre

1

Juste au cas où vous auriez pu ignorer cela, assurez-vous que vous travaillez avec the latest versions of both the pysqlite2 data base adapter and the sqlite3 library. La réponse liée montre également comment déterminer exactement quelle version de chacun d'entre vous utilisez, les données que vous pourriez vouloir ajouter à votre question.

+0

J'ai vérifié cela. C'est la dernière version. Lors de l'installation de pysqlite, vous pouvez réellement lui dire de télécharger et de construire la dernière version, ce que j'ai fait. –

+2

Il serait toujours utile de donner plus d'informations sur les plates-formes, les versions python, les versions pysqlite2, les versions apsw et les versions sqlite3 que vous utilisez. Il y a tellement de cibles mobiles dans votre question, il est difficile de savoir par où commencer. –

0

je peux offrir mon expérience sur une expérience similaire, mais avec une autre plate-forme, à savoir J.

Il y avait une certaine lenteur, et je mis le doigt à la fonction sqlite3_get_table. Cette fonction renvoie un pointeur pour chaque colonne, chacun pointant vers un tableau de pointeurs, où chacun d'entre eux fait référence à une chaîne terminée par un caractère nul. Les pointeurs peuvent aussi être null si le résultat d'une fonction est nul (disons un Max sur un dataset vide, il retournera un pointeur nul, et non un pointeur sur un null.) Je déteste ça. formez une grande matrice d'adresses suivie d'un 0 pour le décalage et de -1 pour la longueur, c'est-à-dire jusqu'au premier zéro) et parcourez chacune d'entre elles pour reformer la table dans ses colonnes et ses rangées prévues. Donc, il y a un aspect de transfert de mémoire, aussi bien que l'aspect de lecture réel, pour récupérer des données de SQLite vers une autre plate-forme. J'ai trouvé que ce jeu de données souvent volumineux n'est pas facilement géré par J, ce qui signifie qu'il est maladroit comme toutes les chaînes. De plus, il y a cette chose nulle pointeur méchant.

J'ai été capable de limiter les modifications de matrice assez pour optimiser la fonction. L'optimisation finale consistait à utiliser le code primitif pour lire une adresse mémoire (15!:1), et non décemment nommée function (memr), car l'utilisation de memr signifiait que J devait interpréter ce que memr signifiait à chaque mémoire lue. En conclusion, si python permet certaines modifications, vous pouvez peut-être modifier l'accès à la base de données pour mieux répondre à vos besoins. J'espère que cela aide, mais je n'ai pas de très grands espoirs ...

Questions connexes