Python中如何将sqlite3的硬盘数据库转换成内存模式?

刚开始学习 sqlite3 ,请问一下,如果是数据库保存在硬盘上,那么能不能转换成内存模式再操作? 主要是用于查询这块,我保存了电话区号,省市名称等内容,想一次性转换成内存模式,调用起来快些。


Python中如何将sqlite3的硬盘数据库转换成内存模式?
21 回复

提前读出来?


import sqlite3
import io

def disk_to_memory(db_path):
    """
    将硬盘SQLite数据库完整复制到内存数据库
    
    参数:
        db_path: 硬盘数据库文件路径
    返回:
        memory_conn: 内存数据库连接对象
    """
    # 创建内存数据库连接
    memory_conn = sqlite3.connect(':memory:')
    
    # 连接原始硬盘数据库
    disk_conn = sqlite3.connect(db_path)
    
    try:
        # 使用iterdump()获取所有SQL语句
        for line in disk_conn.iterdump():
            memory_conn.execute(line)
        
        # 提交事务
        memory_conn.commit()
        
        # 验证数据是否完整复制
        disk_cursor = disk_conn.execute("SELECT COUNT(*) FROM sqlite_master WHERE type='table'")
        mem_cursor = memory_conn.execute("SELECT COUNT(*) FROM sqlite_master WHERE type='table'")
        
        disk_table_count = disk_cursor.fetchone()[0]
        mem_table_count = mem_cursor.fetchone()[0]
        
        print(f"复制完成: 硬盘数据库有 {disk_table_count} 个表,内存数据库有 {mem_table_count} 个表")
        
        return memory_conn
        
    finally:
        disk_conn.close()

# 使用示例
if __name__ == "__main__":
    # 假设你的硬盘数据库文件是 'my_database.db'
    mem_conn = disk_to_memory('my_database.db')
    
    # 现在可以使用内存数据库了
    cursor = mem_conn.cursor()
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
    tables = cursor.fetchall()
    print("内存数据库中的表:", tables)
    
    # 记得最后关闭连接
    mem_conn.close()

核心就两步:1)连上硬盘库用iterdump()导出所有SQL;2)在内存库里执行这些SQL。这样数据、表结构、索引全过去了。

简单说就是iterdump()导数据,内存库里重跑一遍。

读出来再导入到内存数据库中?太麻烦了吧,能不能用一两条语句转换的?

弱鸡表示不知道啥叫内存数据库。。。。。

直接上 redis 呗

单例,延时加载,条件预加载

https://stackoverflow.com/questions/3850022/how-to-load-existing-db-file-to-memory-in-python-sqlite3
大致思路是先备份然后恢复到内存数据库中
我就在想有没有什么能直接操作内存的方法,比如直接把文件读了放在内存里,然后告诉 sqlite3 内存位置,估计读源码肯定可以,就找处理:memory:那段代码修改

小码民路过。。。前几年用 C++ & cppsqlite3 做背单词的小软件,把金山词霸词库 XML 的格式( 23 万单词加例句,词性,解释,音标什么的几乎一字不漏弄进去了,数据库也就单文件 26M 上下),查个单词加组织起来的界面显示都是很快的,所以当时略了解过 sqlite3 的皮毛,似乎在理解的印象+文档中, sqlite 检索决定性并不在于 I/O (当然 I/O 也很重要),而在于分库+索引+算法,当时在论坛上有老外做了一秒 2,3 百万的压力也是妥妥的,当时也有想过楼主的问题,没研究下去了,觉得没必要。因为在内存里操作,就直接等于写字节了,而不在于对数据库的操作了,总不能为了喝牛奶而去研究牛的养殖方式吧,如果楼主研究成功了,麻烦烧纸告知,谢谢!

漏写了一句,楼主研究学习还是很支持的~

同步到 /dev/shm 中 ?( 逃

…我当初是把 SQLite3 数据库放在了内存盘中…
结果 insert 速度提升了似乎有几十倍。。。。

原本要插好几分钟的数据,只花了十秒左右。。。

linux 下,用 tmpfs 保存数据库文件副本

其实我现在已经实现了,在运行时新建一个内存数据库,把硬盘数据库内的记录一条条导入到内存数据库中,但我觉得这种方法比较 LOW ,是吧,所以想看看有没有更为简便的方法能用一两条语句就直接转换了的。

python sqlite3 的 connect 有个 iterdump()
具体的自己看手册去 嘿嘿 就不告诉你

得到太容易 容易忘记 ^_^

ramdisk (匿了



关于 iterdump() 我只找到这一个,并没找到相关文档,这个实例是从内存库里导到文件库的,但我的需要是相反的啊,我想从文件库里导到内存中。
buffer = StringIO.StringIO()
>>for line in db.iterdump():
>>>>buffer.write(line)
>>db.close()

推荐一个神库 sqlitedict ,用过之后保准上瘾。题主闲存进内存麻烦的话,用这个就是一两行代码的问题。

刚粗略看了下,是挺好的,待细究,谢谢

你先对 文件库里的 iterdump
然后再建一个内存库 内存库导入这个 dump 不就完了

两个 sqlite db a 是磁盘 b 内存
a dump 后
b 导入 a 的 dump

然后进程结束钱 b dump 然后 a 导入 b 的 dump

脑子咋不灵活点呢

我滴天啊~
19 个回复,竟然没有一个是对的.
rc = sqlite3_open(":memory:", &db);
https://www.sqlite.org/inmemorydb.html

回到顶部