我有一个 100 MB 的 SQLite 数据库文件,我想在执行 SQL 查询之前将其加载到内存中。用 Python 可以做到吗?
apsw 是 sqlite 的替代包装器,它使您能够在执行操作之前将磁盘数据库备份到内存。
来自文档:
###
### 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
是您的磁盘数据库。
这是一个 Tcl 中的示例(取自此处)(对于了解总体思路可能很有用):
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}
}
}
如果您使用Linux,您可以尝试tmpfs,这是一个基于内存的文件系统。
使用起来非常简单:
请记住,重启后 tmpfs 中的任何内容都会丢失。因此,如果数据库文件发生更改,您可以将其复制回磁盘。
请注意,您可能根本不需要显式地将数据库加载到 SQLite 的内存中。只需将操作系统磁盘缓存复制到 null 即可对其进行填充。
Windows: copy file.db nul:
Unix/Mac: cp file.db /dev/null
这样做的优点是操作系统负责内存管理,特别是在出现更重要的事情时丢弃它。