使用只读模式的SQLALCHEMIY/SQLITE将磁盘IO降至最低

wz3gfoph  于 2022-11-15  发布在  SQLite
关注(0)|答案(1)|浏览(217)

我正在修改一个项目,通过SQLALCHEMY打开一个SQLite数据库。
我正在运行此应用程序的多个进程,这似乎导致了一些(锁定?)问题。进程停止等待IO(顶部的状态D)。
数据库只被查询/读取,而不会被写入。不幸的是,5 GB的数据库文件位于一个NFS目录上,因此读取不是即时的。
我可以将数据库设置为read-only吗?那么,Sqlite/SqlalChemy会避免锁定/事务机制吗?设置ISOLATION_LEVEL=“READ UNCOMMITTED”似乎还不够。从文档中我不清楚我应该如何以及是否应该设置SERIALIZABLE。
或者,我想我可以先copy the db to memory,但不清楚如何将内存数据库移交给SqlalChemy。我应该在连接时复制吗?

tv6aics1

tv6aics11#

我能够通过将数据库复制到内存中来解决它,方法是替换

ENGINE = create_engine('sqlite:///' + DATABASE_FILE)

有:

ENGINE = create_engine('sqlite:///')
import sqlite3
filedb = sqlite3.connect('file:' + DATABASE_FILE + '?mode=ro', uri=True)
print("loading database to memory ...")
filedb.backup(ENGINE.raw_connection().connection)
print("loading database to memory ... done")
filedb.close()

紧随其后的是

BASE = declarative_base()
SESSION = sessionmaker(bind=ENGINE)

相关问题