两个进程可以同时访问内存(:memory :) sqlite数据库吗?

DDC*_*DDC 15 python sqlite

是否可以在一个进程中访问数据库,在另一个进程中创建?我试过了:

空闲#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()
Run Code Online (Sandbox Code Playgroud)

IDLE#2

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute("select * from test")
Run Code Online (Sandbox Code Playgroud)

错误:

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    q = c.execute("select * from test")
sqlite3.OperationalError: no such table: test
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 22

不,他们不能从不同的进程访问相同的内存数据库相反,新的连接:memory: 总是创建一个新的数据库.

SQLite文档:

Every:memory:数据库彼此不同.因此,打开两个数据库连接,每个数据库连接的文件名为":memory:",将创建两个独立的内存数据库.

这与磁盘数据库不同,在磁盘数据库中,使用相同的连接字符串创建多个连接意味着您将连接到一个数据库.

一个进程中,如果使用file::memory:?cache=sharedURI ,则可以共享内存数据库:

conn = sqlite3.connect('file::memory:?cache=shared', uri=True)
Run Code Online (Sandbox Code Playgroud)

但这仍然无法通过其他流程访问.

  • @corretge:`file :: memory:?cache = shared` url仅在我写这篇文章前几个月才推出,我明白了.我添加了一个提及,但正如你所说,这在多个进程中不可用. (2认同)

tes*_*t30 15

当然我同意@Martijn,因为doc是这样说的,但是如果你专注于像unix这样的系统,那么你可以使用共享内存:

如果在/dev/shm文件夹中创建文件,则创建的所有文件都直接映射到RAM,因此您可以使用从两个不同的进程访问同一个数据库.

#/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;"'
Run Code Online (Sandbox Code Playgroud)

花了那么多时间:

FILE=/dev/shm/test.db
real    0m0.927s
user    0m0.834s
sys 0m0.092s
Run Code Online (Sandbox Code Playgroud)

对于至少200万条记录,在HDD上执行相同操作(这是相同的命令但是FILE=/tmp/test.db):

FILE=/tmp/test.db
real    0m2.309s
user    0m0.871s
sys 0m0.138s
Run Code Online (Sandbox Code Playgroud)

所以基本上这允许你从不同的进程访问相同的数据库(不会失去r/w速度):

这是演示我正在谈论的内容:

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;"' &
;
Run Code Online (Sandbox Code Playgroud)

  • 不要使用`/ dev / shm`本身,而是创建`tmpfs`的另一个实例,例如参见/sf/answers/3001903621/ (2认同)