Ada*_*tan 57 python sqlite performance
我有一个现有的sqlite3
db文件,我需要在其上进行一些大量的计算.从文件中进行计算是非常缓慢的,因为文件不大(〜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文本格式转储数据库.在保存内存数据库以便以后恢复时很有用.此函数提供与.dump
sqlite3 shell中的命令相同的功能."
获取这样的迭代器并将基于磁盘的数据库转储到基于内存的数据库中,然后就可以进行计算了.计算完成后,只需将其他方法转储回磁盘即可.
首先,您应该尝试找出导致您观察到的缓慢的原因.你在写表吗?您的写入是否在足够大的事务中,以便您不会将不必要的临时结果保存到磁盘?你能改变写入临时表(带pragma temp_store=memory
)吗?你能和我一起生活pragma synchronous=off
吗?
我不认为这个功能在Python模块中公开,但是sqlite有一个备份API,听起来就像你要求的那样:一种从一个数据库复制到另一个数据库的方法(其中一个可能是内存中的一个)数据库)几乎自动工作,没有任何用户可见的表枚举.(也许APSW暴露了这个?)
另一个选择是创建一个ram磁盘(如果你有足够的环境控制)并在那里复制该文件.
如果必须使用python包装器,那么没有比第二遍读取和写入解决方案更好的解决方案了。但是从3.7.17版本开始,SQLite可以选择使用内存映射的I / O直接访问磁盘内容。sqlite mmap
如果要使用mmap,则必须使用C接口,因为没有包装器提供它。
还有另一种硬件解决方案,即存储磁盘。然后,您便拥有了方便的文件IO和存储速度。
那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)
归档时间: |
|
查看次数: |
31142 次 |
最近记录: |