将SQLite表放在RAM而非闪存中
我们现在在做一个Python项目,主要是从SQLite数据库中读取和写入M2M数据。这个数据库有很多个表,其中一个表用来存储来自云端的当前值。这个表让我有点担心,因为它写入的频率很高,而我们的应用程序是运行在一个闪存驱动器上的。
我听说虚拟表可能是解决这个问题的方法。我考虑把这个关键的表转换成一个虚拟表,然后把它的内容链接到一个存储在内存中的真实文件(比如XML或JSON,像Debian中的/tmp)。我在阅读这篇文章:http://drdobbs.com/database/202802959?pgno=1,它大致解释了我想做的事情。这个过程相当复杂,我觉得用Python实现起来可能不太容易。也许我们需要开发自己的SQLite扩展,我也不太确定……
有没有什么想法可以让我们把这个冲突的表放在内存中,而数据库的其他部分仍然保留在闪存上?有没有更好或更简单的方法来在Python中使用虚拟表?
2 个回答
0
使用一种内存中的数据结构服务器。Redis 是一个很不错的选择,你可以很简单地用列表来实现一个表格。而且,它还提供了一个不错的 Python 驱动程序。
1
一个非常简单的,只用SQL就能创建内存表的方法是使用SQLite的ATTACH
命令,配合特殊的“:memory:”伪文件名:
ATTACH DATABASE ":memory:" AS memdb;
CREATE TABLE memdb.my_table (...);
因为整个数据库“memdb”都保存在内存中,所以一旦你关闭数据库连接,数据就会丢失,因此你需要自己处理数据的持久化。
一种处理方法可以是:
- 打开你的主SQLite数据库文件
- 附加一个内存中的辅助数据库
- 在内存数据库中复制你性能要求高的表
- 在这个复制的表上执行所有查询
- 完成后,把内存表的数据写回到原来的表中(
BEGIN; DELETE FROM real_table; INSERT INTO real_table SELECT * FROM memory_table;
)
但我能给你的最好建议是:确保你真的有性能问题,简单的解决方案可能已经足够快了!