¿Pueden dos procesos acceder a la base de datos sqlite en memoria (: memoria :) al mismo tiempo?

¿Es posible acceder a la base de datos en un proceso, creado en otro? Lo intenté:

IDLE # 1

import sqlite3 conn = sqlite3.connect(':memory:') c = conn.cursor() c.execute("create table test(testcolumn)") c.execute("insert into test values('helloooo')") conn.commit() conn.close() 

IDLE # 2

 import sqlite3 conn = sqlite3.connect(':memory:') c = conn.cursor() c.execute("select * from test") 

Error:

 Traceback (most recent call last): File "", line 1, in  q = c.execute("select * from test") sqlite3.OperationalError: no such table: test 

No, nunca pueden acceder a la misma base de datos en memoria desde diferentes procesos. En cambio, una nueva conexión a :memory: siempre crea una nueva base de datos.

De la documentación de SQLite :

Every: memory: database es distinta de las demás. Por lo tanto, al abrir dos conexiones de base de datos, cada una con el nombre de archivo “: memory:”, se crearán dos bases de datos en memoria independientes.

Esto es diferente de una base de datos en disco, donde crear múltiples conexiones con la misma cadena de conexión significa que se está conectando a una base de datos.

Dentro de un proceso , es posible compartir una base de datos en memoria si usa el file::memory:?cache=shared URI:

 conn = sqlite3.connect('file::memory:?cache=shared', uri=True) 

pero esto todavía no es accesible desde otro otro proceso.

por supuesto, estoy de acuerdo con @Martijn porque doc lo dice, pero si está enfocado en los sistemas unix, entonces puede usar la memoria compartida:

Si crea un archivo en la carpeta /dev/shm , todos los archivos creados allí se asignan directamente a la RAM, por lo que puede utilizar para acceder a la misma base de datos desde dos procesos diferentes.

 #/bin/bash rm -f /dev/shm/test.db time bash -c $' FILE=/dev/shm/test.db sqlite3 $FILE "create table if not exists tab(id int);" sqlite3 $FILE "insert into tab values (1),(2)" for i in 1 2 3 4; do sqlite3 $FILE "INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5"; done; #inserts at most 2'000'000 records to db. sqlite3 $FILE "select count(*) from tab;"' 

toma mucho tiempo

 FILE=/dev/shm/test.db real 0m0.927s user 0m0.834s sys 0m0.092s 

para al menos 2 millones de registros, hacer lo mismo en tomas de disco duro (este es el mismo comando pero FILE=/tmp/test.db ):

 FILE=/tmp/test.db real 0m2.309s user 0m0.871s sys 0m0.138s 

así que básicamente esto le permite acceder a las mismas bases de datos desde diferentes procesos (sin perder r / w de velocidad):

Aquí está una demostración demostrando esto de lo que estoy hablando:

 xterm -hold -e 'sqlite3 /dev/shm/testbin "create table tab(id int); insert into tab values (42),(1337);"' & xterm -hold -e 'sqlite3 /dev/shm/testbin "insert into tab values (43),(1338); select * from tab;"' & ;