【问题标题】:Real-time access to simple but large data set with Python使用 Python 实时访问简单但庞大的数据集
【发布时间】:2025-11-27 23:00:01
【问题描述】:

我目前面临的问题是必须经常在小型 (700 Mhz) 设备上实时访问大型但简单的数据集。该数据集包含大约 400,000 个从缩写词到缩写词的映射,例如“frgm”到“片段”。设备使用时会频繁读取,不宜超过15-20ms。

我的第一次尝试是利用 SQLite 创建一个简单的数据库,该数据库仅包含一个表,其中两个字符串构成一个数据集:

CREATE TABLE WordMappings (key text, word text)

此表只创建一次,尽管可以更改,但只有读取访问是时间关键的。

this guide 之后,我的 SELECT 语句如下所示:

def databaseQuery(self, query_string):
    self.cursor.execute("SELECT word FROM WordMappings WHERE key=" + query_string + " LIMIT 1;")
    result = self.cursor.fetchone()

    return result[0]

但是,在包含 20,000 个缩写的测试数据库上使用此代码时,我无法以超过 60 毫秒的速度获取数据,这太慢了。

关于如何使用 SQLite 提高性能或其他方法会产生更有希望的结果的任何建议?

【问题讨论】:

  • 您是否有足够的内存来保存所有数据?如果是这样,请将其加载到字典中...

标签: python database sqlite real-time


【解决方案1】:

您可以通过为 key 列创建索引来加快查找速度:

CREATE INDEX kex_index ON WordMappings(key);

要检查查询是使用索引还是扫描整个表,请使用EXPLAIN QUERY PLAN

【讨论】:

    【解决方案2】:

    很久以前,我尝试将 SQLite 用于顺序数据,但它的速度不足以满足我的需求。当时,我正在将它与我最终使用的现有内部二进制格式进行比较。

    我没有亲自使用过,但是有朋友用PyTables做大时间序列数据;也许值得研究。

    【讨论】:

      【解决方案3】:

      事实证明,定义主键可以将单个查询的速度提高一个数量级。

      对包含 400,000 个随机创建的条目(10/20 个字符长)的测试表进行单独查询所用时间不超过 5 毫秒,满足要求。

      现在创建的表如下:

      CREATE TABLE WordMappings (key text PRIMARY KEY, word text)
      

      使用主键是因为

      • 它是隐式唯一的,这是存储的缩写的属性
      • 它不能为 NULL,因此包含它的行不能为 NULL。在我们的例子中,如果它们是,数据库就会损坏

      其他用户建议使用索引,但是,它们不一定是唯一的,根据the accept answer to this question,它们不必要地减慢了更新/插入/删除的性能。尽管如此,使用索引也可以提高性能。然而,这没有经过原作者的测试,虽然没有经过原作者的测试。

      【讨论】: