将SQLite表放在RAM而非闪存中

2 投票
2 回答
1316 浏览
提问于 2025-04-17 03:51

我们现在在做一个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”都保存在内存中,所以一旦你关闭数据库连接,数据就会丢失,因此你需要自己处理数据的持久化。

一种处理方法可以是:

  1. 打开你的主SQLite数据库文件
  2. 附加一个内存中的辅助数据库
  3. 在内存数据库中复制你性能要求高的表
  4. 在这个复制的表上执行所有查询
  5. 完成后,把内存表的数据写回到原来的表中(BEGIN; DELETE FROM real_table; INSERT INTO real_table SELECT * FROM memory_table;

但我能给你的最好建议是:确保你真的有性能问题,简单的解决方案可能已经足够快了!

撰写回答