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

Python 快速将内存中的数据库转储到文件,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我想利用在内存中保存SQLite数据库(通过SQLAlchemy)的速度优势,同时执行一次性插入内容的过程,然后将其转储到文件中,存储起来供以后使用 考虑一个bog标准数据库: 除了创建一个全新的数据库并手动插入每个条目外,是否有更快的方法将其内容移动到光盘上 编辑: 我甚至怀疑使用内存数据库是否会带来好处。不幸的是,我已经看到了大约120倍的巨大时差 这种混乱可能是因为我遗漏了问题中的一些重要细节。也可能是因为我对缓存/页面大小等方面缺乏了解。请允许我详细说明: 我正在对已设置的系统进行模拟,

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

考虑一个bog标准数据库:

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

编辑:

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

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

我正在对已设置的系统进行模拟,每次模拟都要经过以下阶段:

  • 对数据库进行一些查询
  • 根据这些查询的结果进行计算/运行模拟
  • 根据最近的模拟将新条目插入数据库
  • 通过运行,确保数据库对新条目是最新的
  • 虽然每次模拟运行时我只插入了十几个左右,但我确实运行了数百万次模拟,每次模拟的结果都需要为将来的模拟提供。正如我所说,当运行一个以文件为基础的数据库时,这种读写过程需要相当长的时间;这是6小时和一个月的差距


    希望这能澄清问题。如果需要的话,我可以拼凑一个简单的python脚本来进一步概述我的过程。

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

    在这里使用内存中的SQLite数据库没有任何好处,因为该数据库使用的页面与磁盘上的版本一样,唯一的区别是最终这些页面会被写入基于磁盘的数据库的磁盘中。性能差异仅为1.5倍,请参阅


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

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


    我已经对原始问题进行了编辑,解决了您的一些问题。您无法创建数据缓存并将数据保留在内存中。如果我正确理解您的问题,我的答案是否定的。诚然,我不会使用我转储到数据库中的每一条信息,但是,我确实使用了以前运行的每个模拟中的一条信息。我的模拟也将变得相当复杂,以更复杂的方式使用过去的数据。我曾希望使用SQL的各种查询命令来帮助我解决一些问题。您是否认为您建议执行批插入是我目前唯一的选择?(对我的响应速度慢表示歉意,顺便说一下,我的ISP正在巡查,因为有点擦伤。)不必道歉,这是一种异步介质。以后无法将内存中的SQLite数据库移动到磁盘,因此必须找到其他方法来加速这一切。使用某种形式的缓存(也可以是内存中的SQLite)将是我的方向。
    # in-memory database
    e = create_engine('sqlite://')
    
    # 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()