Comment charger une base de données existante fichier dans la mémoire en Python sqlite3?
J'ai déjà un sqlite3
fichier de base de données, sur lequel j'ai besoin de faire quelques calculs. Faire les calculs à partir du fichier est très lente, et que le fichier n'est pas grande (~10 MB
), il n'y a pas de problème afin de charger en mémoire.
Est-il un Pythonic façon de charger le fichier existant dans la mémoire pour accélérer les calculs?
Vous devez vous connecter pour publier un commentaire.
Voici le bout de code que j'ai écrit pour ma gourde d'application:
sqlite3.Connexion.iterdump
"[r]eturns un itérateur pour faire un dump de la base de données dans SQL format texte. Utile lors de l'enregistrement d'une base de données en mémoire pour une restauration ultérieure. Cette fonction offre les mêmes capacités que le.dump
commande dans le sqlite3 shell."Obtenir un itérateur et vider le disque de la base de données dans une mémoire à base de l'un, et vous êtes prêt à calculer. Lorsque le calcul est terminé, juste dump l'autre manière autour de l'arrière à disque.
D'abord vous devriez essayer et de trouver ce qui est à l'origine de la lenteur que vous observez. Êtes-vous à l'écriture dans les tables? Sont vos écritures à l'intérieur de grands assez les transactions afin que vous n'enregistrez pas inutile résultats temporaires sur le disque? Pouvez-vous changer écrit d'aller à des tables temporaires (avec
pragma temp_store=mémoire
)? Pouvez-vous vivre avecpragma synchrone=off
?Je ne pense pas que cette fonctionnalité est accessible dans le module Python, mais sqlite a un API de sauvegarde qui ressemble exactement à ce que vous demandez: une façon de copier à partir d'une base de données à une autre (que ce soit l'un des qui peut être une base de données en mémoire) qui fonctionne assez bien, automatiquement et sans aucune visibles pour l'utilisateur de l'énumération des tables. (Peut-être Intervenante ou intervenant expose ce?)
Une autre option est de créer un disque ram (si vous avez suffisamment de contrôle de l'environnement) et de copier le fichier.
si nous devons utiliser un wrapper python,il n'y a pas de meilleure solution que les deux pass, lire et écrire la solution.
mais à partir de la version 3.7.17, SQLite a la possibilité d'accéder à disque directement le contenu à l'aide de memory-mapped I/O.sqlite mmap
si vous souhaitez utiliser mmap,vous devez utiliser l'interface C depuis pas de wrapper fournir.
et il y a une autre solution matérielle,le disque de mémoire.ensuite, vous avez la pratique de fichier e /s et la vitesse de la mémoire.
PRAGMA mmap_size=268435456
comme commande, de sorte qu'il fonctionne avec n'importe quel langage qui prend en charge SQLite (j'utilise C#).Cela a déjà été répondu avant, y compris des exemples de code En python, comment puis-je charger un sqlite db complètement en mémoire avant de vous y connecter?
Vous ne mentionnez pas de système d'exploitation, mais une chasse aux sorcières de Windows XP, c'est qu'il est par défaut un fichier de 10 mo de cache, peu importe combien vous avez de mémoire. (Ce qui fait sens dans les jours lorsque les systèmes sont venus avec 64 mo de mémoire etc). Ce message a plusieurs liens:
http://marc.info/?l=sqlite-users&m=116743785223905&w=2
Ici est un moyen relativement simple de lire un db SQLite en mémoire. En fonction de vos préférences à l'égard de la manipulation de données, vous pouvez soit utiliser les Pandas dataframe ou écrire votre table pour une mémoire de base de données sqlite3. De la même façon après la manipulation de vos données, vous utilisez le même df.to_sqlite approche pour stocker vos résultats dans une table db.
Ce sujet
sqlite3.Connexion.de sauvegarde(...)
? "Cette méthode permet une sauvegarde d'une base de données SQLite alors même que c'est l'accès par d'autres clients, ou simultanément par la même connexion." Disponibilité: SQLite 3.6.11 ou plus. Nouveau dans la version 3.7.sqlite supporte les bases de données en mémoire.
En python, vous pouvez utiliser un :mémoire: nom de base de données pour que.
Peut-être que vous pourriez ouvrir deux bases de données (un fichier, un vide dans la mémoire), de migrer tout le contenu du fichier de base de données en mémoire, puis d'utiliser la base de données en mémoire supplémentaire pour effectuer des calculs.