Python 在磁盘数据库和快速内存数据库之间来回移动?

Python 在磁盘数据库和快速内存数据库之间来回移动?,python,sqlite,Python,Sqlite,Python的sqlite3:memory:选项提供了比同等的磁盘数据库更快的查询和更新。如何将基于磁盘的数据库加载到内存中,对其执行快速操作,然后将更新的版本写回磁盘 这个问题似乎是相关的,但重点是如何在内存数据库上使用基于磁盘的浏览工具。这个问题也是相关的,但它是针对Django的 我当前的解决方案是一次一个地将所有表从基于磁盘的数据库中读取到元组列表中,然后手动重新创建内存数据库的整个数据库模式,然后将元组列表中的数据加载到内存数据库中。在对数据进行操作后,该过程被反转 一定有更好的办法

Python的sqlite3
:memory:
选项提供了比同等的磁盘数据库更快的查询和更新。如何将基于磁盘的数据库加载到内存中,对其执行快速操作,然后将更新的版本写回磁盘

这个问题似乎是相关的,但重点是如何在内存数据库上使用基于磁盘的浏览工具。这个问题也是相关的,但它是针对Django的

我当前的解决方案是一次一个地将所有表从基于磁盘的数据库中读取到元组列表中,然后手动重新创建内存数据库的整个数据库模式,然后将元组列表中的数据加载到内存数据库中。在对数据进行操作后,该过程被反转

一定有更好的办法

当时的答案提供了重要线索。在这个答案的基础上,这里是对代码的简化和概括

它消除了对StringIO的不必要使用,并打包成可重用的形式,用于在内存数据库中进行读写

import sqlite3

def copy_database(source_connection, dest_dbname=':memory:'):
    '''Return a connection to a new copy of an existing database.                        
       Raises an sqlite3.OperationalError if the destination already exists.             
    '''
    script = ''.join(source_connection.iterdump())
    dest_conn = sqlite3.connect(dest_dbname)
    dest_conn.executescript(script)
    return dest_conn

if __name__ == '__main__':
    from contextlib import closing

    with closing(sqlite3.connect('pepsearch.db')) as disk_db:
        mem_db = copy_database(disk_db)

    mem_db.execute('DELETE FROM documents WHERE uri="pep-3154"')
    mem_db.commit()

    copy_database(mem_db, 'changed.db').close()

坦白地说,我不会在内存数据库上浪费太多时间,除非您确实需要一个索引结构,您知道它总是完全适合可用内存。SQLite在I/O方面非常聪明,特别是当您将所有内容(包括读取…)包装到事务中时,您应该这样做。它将非常有效地将内容保存在内存中,因为它正在操作基本上依赖于外部存储的数据结构,但它永远不会耗尽内存(也不会占用太多内存)。我认为RAM作为“缓冲区”确实比作为存储数据的主要场所工作得更好。。。特别是在虚拟存储环境中,所有内容都必须被视为“无论如何都有外部存储支持”。

看起来特别像您的情况。|我的用例是一个长时间运行的进程(一个web服务),数据完全在RAM中(所以在操作过程中根本并没有磁盘i/o)。数据很少发生变化,但我确实经常运行查询。磁盘上的版本只有在系统重新启动后才能保存数据。