在Python中,如何在连接之前将SQLite数据库完全加载到内存中? [重复]

问题描述 投票:0回答:4

我有一个 100 MB 的 SQLite 数据库文件,我想在执行 SQL 查询之前将其加载到内存中。用 Python 可以做到吗?

python sql memory sqlite
4个回答
12
投票

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
是您的磁盘数据库。


3
投票
  1. 运行内存数据库(标准内容)
  2. 附加磁盘数据库(文件)。
  3. 重新创建表/索引并复制内容。
  4. 分离磁盘数据库(文件)

这是一个 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}
    }
}

3
投票

如果您使用Linux,您可以尝试tmpfs,这是一个基于内存的文件系统。

使用起来非常简单:

  1. 将 tmpfs 挂载到目录。
  2. 将sqlite db文件复制到该目录。
  3. 将其作为普通 sqlite 数据库文件打开。

请记住,重启后 tmpfs 中的任何内容都会丢失。因此,如果数据库文件发生更改,您可以将其复制回磁盘。


1
投票

请注意,您可能根本不需要显式地将数据库加载到 SQLite 的内存中。只需将操作系统磁盘缓存复制到 null 即可对其进行填充。

Windows: copy file.db nul:
Unix/Mac:  cp file.db /dev/null

这样做的优点是操作系统负责内存管理,特别是在出现更重要的事情时丢弃它。

© www.soinside.com 2019 - 2024. All rights reserved.