2009-08-06 7 views
2

SQLite est une petite base de données, mais j'ai un problème avec Windows. L'exécution d'une requête sur une base de données de 100 Mo peut prendre jusqu'à 50 secondes lors du premier lancement de l'application. Les charges subséquentes prennent 10% de ce temps.Windows Pre-Caching SQLite problème

Après quelques discussions sur la liste de diffusion de données SQLite, on me dit « Le bogue est dans Windows agressivement les fichiers de base de données pré-caches grands
-. Lit dans de gros morceaux de fichiers - pour le faire paraître comme si les programmes
comme Outlook sont meilleurs qu'ils ne le sont vraiment. Malheureusement, bien que
cela accélère certains programmes, il fait d'autres agissent saccadés parce qu'ils
ont aucun contrôle sur la quantité est lu quand ils demandent seulement quelques
octets fichier."

Ce problème est aggravé car il n'y a aucun moyen d'obtenir des informations de progression pendant que tout cela se produit à partir de SQLite, donc mes utilisateurs pensent que quelque chose est cassé. (Je pourrais afficher un rapport de progression fictif, mais c'est vraiment ringard pour un outil pointu.)

Je crois qu'il existe un moyen d'arrêter la pré-mise en cache globalement, mais est-ce qu'il y a un moyen de contourner ce programme?

Répondre

1

Je ne sais pas comment résoudre le problème de mise en cache, mais 50 secondes semble extrême. Si la requête elle-même en prend 10%, cela signifie 45 secondes pour charger un fichier de 100mb. Même si Windows lit le fichier entier en une fois, cela ne devrait pas prendre plus de quelques secondes avec des vitesses de disque dur normales.

Le fichier est-il très fragmenté ou quelque chose?

Il me semble qu'il n'y a pas que le precaching ici.

+0

Certainement. J'ai travaillé avec des bases de données sqlite de taille similaire et je n'ai pas rencontré ce problème. –

+0

Oui, je pense que vous avez raison. La requête n'est pas simple. Je soupçonne que SQLite fait quelque chose, mais il n'y a aucun moyen de savoir quoi (sans entrer dans son code qui ne veut pas faire). Puisque les demandes subséquentes sont au plus 20% de ce temps, il s'agit évidemment d'un événement ponctuel. –

+0

ne pouvez-vous pas simplement passer à travers un profileur et voir quelle (s) fonction (s) mange tout ce temps? – jalf

1

J'ai aussi le même problème avec ma première requête. Le problème revient après ne pas interroger la base de données pendant longtemps. Il semble être un problème de mémoire cache. Mon logiciel s'exécute 24/7 et de temps en temps l'utilisateur exécute la requête SELECT. J'effectue également la requête sur une base de données de la même taille.

Questions connexes