快速将内存中的数据库转储到文件中

时间:2013-04-05 13:40:45

标签: python sqlite sqlalchemy

我希望利用在内存中执行SQLite数据库(通过SQLAlchemy)的速度优势,同时我通过插入内容的一次性过程,然后将其转储到文件中,然后存储以供以后使用。 / p>

考虑沼泽标准数据库created in the usual way

# in-memory database
e = create_engine('sqlite://')

除了创建一个全新的数据库并手动插入每个条目之外,还有更快的方式将其内容移动到光盘吗?

修改

我是否怀疑使用内存数据库是否有任何好处。不幸的是,我已经看到了大约120倍的巨大时差。

这种混乱可能是由于我错过了问题中的一些重要细节。也许可能是由于我对我的缺乏了解:缓存/页面大小/等等。请允许我详细说明:

我正在运行我已设置的系统的模拟,每个模拟都经历以下阶段:

  1. 对数据库进行一些查询。
  2. 根据这些查询的结果进行计算/运行模拟。
  3. insert基于最新模拟的新数据库。
  4. 运行commit()
  5. ,确保数据库与新条目保持同步

    虽然我在每次模拟运行时只进行了十几次插入,但我会运行数百万的模拟,并且每个模拟的结果需要可用为将来的模拟进行。正如我所说,在运行文件支持的数据库时,这个读取写入过程需要相当长的时间;这是6个小时到一个月之间的差异。

    希望这能澄清事情。我可以拼凑一个简单的python脚本,以便在必要时进一步概述我的过程。

2 个答案:

答案 0 :(得分:2)

SQLAlchemy和SQLite知道如何缓存并批量插入就好了。

此处使用内存中的SQLite数据库没有任何好处,因为该数据库使用的页面就像磁盘版本一样,唯一的区别是最终这些页面会被写入基于磁盘的数据库的磁盘。性能差异仅为1.5倍,请参阅SQLite Performance Benchmark -- why is :memory: so slow...only 1.5X as fast as disk?

以后无法将内存数据库移动到基于磁盘的数据库,缺少在内存数据库上运行查询并在两个单独的连接上执行批量插入基于磁盘的数据库

答案 1 :(得分:0)

现在是 2021 年,我的游戏笔记本可以执行 SQL 操作,主要是 INSERT,内存比磁盘快 100 倍。我正在使用 sqlalchemy 的原始连接进行备份(将内存数据库复制到磁盘)。

# create in-memory database. get raw_connection.
engine_memory = sqlalchemy.create_engine('sqlite://')
raw_connection_memory = engine_memory.raw_connection()

# do something to in-memory db
raw_cursor_memory.executescript(my_sql_script)

# save memory db to disk file.
engine_file = sqlalchemy.create_engine('sqlite:///myfile.sqlite')
raw_connection_file = engine_file.raw_connection()
raw_connection_memory.backup(raw_connection_file.connection)
raw_connection_file.close()
engine_file.dispose()