【问题标题】:SQLite table in RAM instead of FLASHRAM 中的 SQLite 表而不是 FLASH
【发布时间】:2011-10-07 18:02:06
【问题描述】:

我们目前正在开发一个 python 项目,该项目主要从 SQLite 数据库读取和写入 M2M 数据。该数据库由多个表组成,其中一个存储来自云的当前值。最后一张表让我有点担心,因为它经常被写入并且应用程序在闪存驱动器上运行。

我听说虚拟表可能是解决方案。我曾考虑将关键表转换为虚拟表,然后将其内容链接到存储在 RAM 中的真实文件(XML 或 JSON)(例如在 Debian 中的 /tmp)。我一直在阅读这篇文章: http://drdobbs.com/database/202802959?pgno=1 这或多或少地解释了如何做我想做的事。这非常复杂,我认为这使用 Python 不太可行。也许我们需要开发自己的sqlite扩展,我不知道......

知道如何将我们的冲突表“放置”在 RAM 中,同时将数据库的其余部分保留在 FLASH 中吗?关于如何在 Python 下采用虚拟表方式的任何更好/更简单的方法?

【问题讨论】:

标签: python sqlite


【解决方案1】:

创建内存表的一个非常简单、仅使用 SQL 的解决方案是使用 SQLite 的 ATTACH 命令和特殊的 ":memory:" 伪文件名:

ATTACH DATABASE ":memory:" AS memdb;
CREATE TABLE memdb.my_table (...);

由于整个数据库“memdb”保存在RAM中,一旦关闭数据库连接,数据就会丢失,所以你必须自己处理持久性。

一种方法可能是:

  1. 打开您的主 SQLite 数据库文件
  2. 附加内存辅助数据库
  3. 在内存数据库中复制对性能至关重要的表
  4. 对重复表运行所有查询
  5. 完成后,将内存表写回原始表 (BEGIN; DELETE FROM real_table; INSERT INTO real_table SELECT * FROM memory_table;)

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

【讨论】:

  • 谢谢。内存方法将是我最后的选择,因为我不希望整个数据库都存储在 RAM 中。但似乎除了虚拟化有问题的表之外我别无选择。
  • 您不需要将整个数据库放在RAM中。像往常一样将主数据库存储在文件中,并使用ATTACH 将额外的内存数据库附加到 SQLite 连接。然后你可以在内存中创建你想要的那些表。
  • 嗯……这很有道理,费迪南德。这样做我们可能仍然保留我们当前的查询并仍然使用相同的连接......我非常喜欢这种方法,谢谢!!
  • 性能不是问题。当前对该表的查询既简单又快速。问题是此表更新非常频繁,闪存驱动器可能会比平时更快磨损。
【解决方案2】:

使用内存数据结构服务器。 Redis 是一个不错的选择,您可以使用列表轻松实现表格。此外,它还带有一个不错的 python 驱动程序。

【讨论】:

  • 好吧,我想避免使用内存中的方式,因为正如 Ferdinand 所说,完整的数据库将保存在 RAM 中。感谢您的提示。
猜你喜欢
  • 2011-09-12
  • 1970-01-01
  • 2017-09-28
  • 2012-12-22
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 2022-06-13
相关资源
最近更新 更多