En python, Comment puis-je charger une base de données sqlite complètement en mémoire avant de me connecter à celle-ci? [dupliquer]
cette question a déjà une réponse ici:
j'ai un fichier de 100 méga octets sqlite db que je voudrais charger en mémoire avant d'effectuer des requêtes sql. Est-ce possible de faire ça en python?
Merci
4 réponses
apsw est un wrapper alternatif pour sqlite, qui vous permet de sauvegarder une base de données sur disque en mémoire avant de faire des opérations.
De la docs :
###
### Backup to memory
###
# We will copy the disk database into a memory database
memcon=apsw.Connection(":memory:")
# Copy into memory
with memcon.backup("main", connection, "main") as backup:
backup.step() # copy whole database in one go
# There will be no disk accesses for this query
for row in memcon.cursor().execute("select * from s"):
pass
connection
ci-dessus est votre base de données sur disque.
- Obtenir une base de données en mémoire en cours d'exécution (norme des choses)
- Attacher le disque de la base de données (fichier).
- recréer des tables / Index et copier sur le contenu.
- Détacher le disque de la base de données (fichier)
voici un exemple (pris d'ici ) dans Tcl (pourrait être utile pour obtenir l'idée générale le long):
proc loadDB {dbhandle filename} {
if {$filename != ""} {
#attach persistent DB to target DB
$dbhandle eval "ATTACH DATABASE '$filename' AS loadfrom"
#copy each table to the target DB
foreach {tablename} [$dbhandle eval "SELECT name FROM loadfrom.sqlite_master WHERE type = 'table'"] {
$dbhandle eval "CREATE TABLE '$tablename' AS SELECT * FROM loadfrom.'$tablename'"
}
#create indizes in loaded table
foreach {sql_exp} [$dbhandle eval "SELECT sql FROM loadfrom.sqlite_master WHERE type = 'index'"] {
$dbhandle eval $sql_exp
}
#detach the source DB
$dbhandle eval {DETACH loadfrom}
}
}
notez que vous n'aurez peut-être pas besoin de charger explicitement la base de données dans la mémoire de SQLite. Activez simplement le cache disque de votre système d'exploitation en le copiant sur null.
Windows: copy file.db nul:
Unix/Mac: cp file.db /dev/null
cela présente l'avantage que le système d'exploitation s'occupe de la gestion de la mémoire, surtout en la rejetant si quelque chose de plus important arrive.
si vous utilisez Linux, vous pouvez essayer tmpfs qui est un système de fichiers basé sur la mémoire.
C'est très facile à utiliser:
- mont tmpfs pour un répertoire.
- Copiez le fichier SQLite db dans le répertoire.
- ouvrir comme fichier SQLite db normal.
rappelez-vous, tout ce qui est dans tmpfs sera perdu après redémarrage. Ainsi, vous pouvez copier le fichier db arrière à disque si elle a changé.