如何将现有的数据库文件加载到Python sqlite3中的内存?
我有一个现有的sqlite3
数据库文件,我需要做一些广泛的计算。 从文件做计算是痛苦的慢,和文件不大(〜10 10 MB
),所以应该没有问题加载到内存。
是否有Pythonic的方式来加载现有的文件到内存中,以加快计算?
以下是我为烧瓶应用程序编写的代码片段:
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
sqlite3.Connection.iterdump
“[r]使用迭代器以SQL文本格式转储数据库,在保存内存数据库以备后续恢复时非常有用,该function提供了与sqlite3 shell中的.dump
命令相同的function。 “
获取这样一个迭代器并将基于磁盘的数据库转储到基于内存的数据库中,然后就可以进行计算了。 计算完成后,只需转储回磁盘即可。
首先,你应该试着找出是什么导致你正在观察的缓慢。 你在写表格吗? 你是否在足够大的事务中写入,以便不会将不必要的临时结果保存到磁盘? 你可以改变写入临时表(与pragma temp_store=memory
)? 你可以住pragma synchronous=off
吗?
我不认为这个function是暴露在Python模块中的,但是sqlite有一个备份API ,它听起来像你所要求的:一种从一个数据库复制到另一个的方法(其中一个可能是一个内存数据库)几乎自动工作,没有任何用户可见的枚举表。 (也许APSW公开这个?)
另一个select是创build一个RAM磁盘(如果你有足够的环境控制)并在那里复制文件。
这已经被回答了,包括代码示例在python,我怎么可以加载一个sqlite数据库完全连接到内存之前呢?
你不提操作系统,但是Windows XP的一个缺点是它默认为10MB的文件caching,不pipe你有多less内存。 (这在系统带有64MB等的日子里是有意义的)。 此消息有几个链接:
这里是一个相对简单的方法来读取SQLite数据库到内存中。 根据您的操作数据偏好,您可以使用Pandas数据框或将您的表写入内存中的sqlite3数据库。 同样,在操作数据之后,您可以使用相同的df.to_sqlite方法将结果存储回数据库表。
import sqlite3 as lite from pandas.io.sql import read_sql from sqlalchemy import create_engine engine = create_engine('sqlite://') c = engine.connect() conmem = c.connection con = lite.connect('ait.sqlite', isolation_level=None) #Here is the connection to <ait.sqlite> residing on disk cur = con.cursor() sqlx = 'SELECT * FROM Table' df = read_sql(sqlx, con, coerce_float=True, params=None) #Read SQLite table into a panda dataframe df.to_sql(con=conmem, name='Table', if_exists='replace', flavor='sqlite')
sqlite支持内存数据库。
在python中,你可以使用:memory:数据库名称。
也许你可以打开两个数据库(一个来自文件,一个是空的),将文件数据库中的所有内容移植到内存中,然后使用内存数据库进行计算。