【问题标题】:Quickly dumping a database in memory to file快速将内存中的数据库转储到文件中
【发布时间】:2013-04-05 13:40:44
【问题描述】:

我想利用在内存中保存一个 SQLite 数据库(通过 SQLAlchemy)的速度优势,同时我经历了插入内容的一次性过程,然后将其转储到文件中,存储以供以后使用。

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

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

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

编辑:

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

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

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

  1. 对数据库进行一些查询。
  2. 根据这些查询的结果进行计算/运行模拟。
  3. insert 基于最新模拟的数据库中的新条目。
  4. 通过运行 commit() 确保数据库是最新的,包含新条目。

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

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

【问题讨论】:

    标签: python sqlite sqlalchemy


    【解决方案1】:

    SQLAlchemy 和 SQLite 知道如何缓存和批量插入。

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

    也没有办法在以后将内存数据库移动到基于磁盘的数据库,除非在内存数据库上运行查询并在两个单独的连接上执行批量插入到基于磁盘的数据库中.

    【讨论】:

    • 我对原始问题进行了编辑,解决了您的一些观点。
    • 您无法创建数据缓存并将数据保存在内存中有用的地方吗?
    • 假设我正确理解了您的问题,我的回答是否定的。诚然,我不会使用我转储到数据库中的每一条信息,但我确实使用来自之前运行的每一个模拟的一条信息。我的模拟也将变得更加复杂,以更复杂的方式使用过去的数据。我曾希望使用 SQL 的各种查询命令来帮助我解决其中的一些问题。
    • 您会说这听起来像您执行批量插入的建议是我目前唯一的选择吗? (顺便说一下,对于我的缓慢响应时间表示歉意,我的 ISP 正在为擦伤而巡航。)
    • 无需道歉,这是异步媒体。您不能稍后将内存中的 SQLite 数据库移动到磁盘,因此您必须找到其他方法来加快这一切。使用某种形式的缓存(可能是内存中的 SQLite另外)将是我的方向。
    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2017-11-04
    • 1970-01-01
    相关资源
    最近更新 更多