¿Cómo cargar un archivo db existente en la memoria en Python sqlite3?

Tengo un archivo db sqlite3 existente, en el que necesito hacer algunos cálculos extensos. Hacer los cálculos desde el archivo es muy lento, y como el archivo no es grande (~ 10 MB ), no debería haber ningún problema para cargarlo en la memoria.

¿Hay alguna forma en Pythonic de cargar el archivo existente en la memoria para acelerar los cálculos?

Aquí está el fragmento que escribí para mi aplicación de matraz:

 import sqlite3 from StringIO import StringIO def init_sqlite_db(app): # Read database to tempfile con = sqlite3.connect(app.config['SQLITE_DATABASE']) tempfile = StringIO() for line in con.iterdump(): tempfile.write('%s\n' % line) con.close() tempfile.seek(0) # Create a database in memory and import from tempfile app.sqlite = sqlite3.connect(":memory:") app.sqlite.cursor().executescript(tempfile.read()) app.sqlite.commit() app.sqlite.row_factory = sqlite3.Row 

sqlite3.Connection.iterdump “[r] hace girar un iterador para volcar la base de datos en un formato de texto SQL. Útil para guardar una base de datos en memoria para una restauración posterior. Esta función proporciona las mismas capacidades que el comando .dump en el shell sqlite3. ”

Obtenga tal iterador y voltee la base de datos basada en disco en una basada en memoria, y estará listo para calcular. Cuando se realiza el cálculo, simplemente volcar al revés al disco.

Primero debes intentar y descubrir qué está causando la lentitud que estás observando. ¿Estás escribiendo a las mesas? ¿Sus escrituras están en transacciones suficientemente grandes para que no guarde resultados innecesarios en el disco? ¿Puede cambiar las escrituras para ir a las tablas temporales (con pragma temp_store=memory )? ¿Puedes vivir con pragma synchronous=off ?

No creo que esta funcionalidad esté expuesta en el módulo de Python, pero sqlite tiene una API de respaldo que suena exactamente como lo que estás pidiendo: una forma de copiar de una base de datos a otra (cualquiera de las cuales puede ser una memoria interna). base de datos) que funciona casi automáticamente sin ninguna enumeración de tablas visible por el usuario. (Tal vez APSW expone esto?)

Otra opción es crear un disco RAM (si tiene suficiente control del entorno) y copiar el archivo allí.

Si debemos usar una envoltura de Python, entonces no hay mejor solución que las dos soluciones de paso, lectura y escritura. pero a partir de la versión 3.7.17, SQLite tiene la opción de acceder al contenido del disco directamente mediante E / S asignadas en memoria. sqlite mmap

Si desea usar mmap, tiene que usar la interfaz C ya que ningún contenedor lo proporciona.

y existe otra solución de hardware, el disco de memoria. Luego tiene el IO de archivo conveniente y la velocidad de la memoria.

Esto ya se ha respondido anteriormente, incluidos los ejemplos de código en In Python, ¿cómo puedo cargar un db sqlite completamente en la memoria antes de conectarme a él?

No menciona el sistema operativo, pero una de las ventajas de Windows XP es que el valor predeterminado es un caché de archivos de 10 MB, sin importar cuánta memoria tenga. (Esto tenía sentido en los días en que los sistemas venían con 64 MB, etc.). Este mensaje tiene varios enlaces:

http://marc.info/?l=sqlite-users&m=116743785223905&w=2

Aquí hay una forma relativamente simple de leer un db SQLite en la memoria. Dependiendo de sus preferencias con respecto a la manipulación de datos, puede usar el dataframe de Pandas o escribir su tabla en una base de datos sqlite3 en memoria. De manera similar, después de manipular sus datos, utiliza el mismo enfoque df.to_sqlite para almacenar sus resultados en una tabla de db.

 import sqlite3 as lite from pandas.io.sql import read_sql from sqlalchemy import create_engine engine = create_engine('sqlite://') c = engine.connect() conmem = c.connection con = lite.connect('ait.sqlite', isolation_level=None) #Here is the connection to  residing on disk cur = con.cursor() sqlx = 'SELECT * FROM Table' df = read_sql(sqlx, con, coerce_float=True, params=None) #Read SQLite table into a panda dataframe df.to_sql(con=conmem, name='Table', if_exists='replace', flavor='sqlite') 

¿Qué pasa con sqlite3.Connection.backup(...) ? “Este método hace una copia de seguridad de una base de datos SQLite incluso cuando otros clientes la acceden, o al mismo tiempo por la misma conexión”. Disponibilidad: SQLite 3.6.11 o superior. Nuevo en la versión 3.7.

 import sqlite3 source = sqlite3.connect('existing_db.db') dest = sqlite3.connect(':memory:') source.backup(dest) 

sqlite soporta bases de datos en memoria.

En Python, usarías un nombre de : memory: database para eso.

Tal vez podría abrir dos bases de datos (una desde el archivo, una vacía en la memoria), migrar todo desde la base de datos de archivos a la memoria, y luego usar la base de datos en la memoria para hacer cálculos.