如何在Python sqlite3中将现有的db文件加载到内存中?

Ada*_*tan 57 python sqlite performance

我有一个现有的sqlite3db文件,我需要在其上进行一些大量的计算.从文件中进行计算是非常缓慢的,因为文件不大(〜10 MB),所以将它加载到内存中应该没有问题.

是否有Pythonic方法将现有文件加载到内存中以加快计算速度?

Cen*_*lti 109

这是我为我的烧瓶应用程序编写的片段:

import sqlite3
from StringIO import StringIO

def init_sqlite_db(app):
    # Read database to tempfile
    con = sqlite3.connect(app.config['SQLITE_DATABASE'])
    tempfile = StringIO()
    for line in con.iterdump():
        tempfile.write('%s\n' % line)
    con.close()
    tempfile.seek(0)

    # Create a database in memory and import from tempfile
    app.sqlite = sqlite3.connect(":memory:")
    app.sqlite.cursor().executescript(tempfile.read())
    app.sqlite.commit()
    app.sqlite.row_factory = sqlite3.Row
Run Code Online (Sandbox Code Playgroud)


Fre*_*Foo 16

sqlite3.Connection.iterdump"[r] eturns迭代器以SQL文本格式转储数据库.在保存内存数据库以便以后恢复时很有用.此函数提供与.dumpsqlite3 shell中的命令相同的功能."

获取这样的迭代器并将基于磁盘的数据库转储到基于内存的数据库中,然后就可以进行计算了.计算完成后,只需将其他方法转储回磁盘即可.

  • 所以没有人会举一个代码的例子? (5认同)
  • 这很好,但是如何将转储恢复到内存数据库? (3认同)
  • Wohoo!奇迹般有效. (3认同)

Jou*_*nen 8

首先,您应该尝试找出导致您观察到的缓慢的原因.你在写表吗?您的写入是否在足够大的事务中,以便您不会将不必要的临时结果保存到磁盘?你能改变写入临时表(带pragma temp_store=memory)吗?你能和我一起生活pragma synchronous=off吗?

我不认为这个功能在Python模块中公开,但是sqlite有一个备份API,听起来就像你要求的那样:一种从一个数据库复制到另一个数据库的方法(其中一个可能是内存中的一个)数据库)几乎自动工作,没有任何用户可见的表枚举.(也许APSW暴露了这个?)

另一个选择是创建一个ram磁盘(如果你有足够的环境控制)并在那里复制该文件.


obg*_*naw 5

如果必须使用python包装器,那么没有比第二遍读取和写入解决方案更好的解决方案了。但是从3.7.17版本开始,SQLite可以选择使用内存映射的I / O直接访问磁盘内容。sqlite mmap

如果要使用mmap,则必须使用C接口,因为没有包装器提供它。

还有另一种硬件解决方案,即存储磁盘。然后,您便拥有了方便的文件IO和存储速度。


thi*_*ybk 5

sqlite3.Connection.backup(...)呢 “即使其他客户端正在访问该SQLite数据库,也可以通过同一连接同时进行该方法,它还是对SQLite数据库进行备份。” 可用性:SQLite 3.6.11或更高版本。3.7版中的新功能。

import sqlite3

source = sqlite3.connect('existing_db.db')
dest = sqlite3.connect(':memory:')
source.backup(dest)
Run Code Online (Sandbox Code Playgroud)

  • 如果您有 Python 3.7+,这似乎是最好的方法。 (2认同)
  • @roskakori 我也这么认为;) (2认同)