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:

  • comment charger un fichier db existant en mémoire dans Python sqlite3? 7 réponses

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

7
demandé sur Adam Matan 2010-09-30 03:10:08

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.

11
répondu Ryan Ginstrom 2014-05-23 21:45:54
  1. Obtenir une base de données en mémoire en cours d'exécution (norme des choses)
  2. Attacher le disque de la base de données (fichier).
  3. recréer des tables / Index et copier sur le contenu.
  4. 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}
    }
}
3
répondu ChristopheD 2010-09-29 23:19:21

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.

1
répondu Roger Binns 2010-10-01 02:34:09

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:

  1. mont tmpfs pour un répertoire.
  2. Copiez le fichier SQLite db dans le répertoire.
  3. 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é.

1
répondu animalize 2014-08-27 07:52:49