繁体   English   中英

使用Python实时访问简单但庞大的数据集

[英]Real-time access to simple but large data set with Python

我目前面临的问题是,必须经常实时访问较小(700 Mhz)设备上的大型但简单的数据集。 数据集包含从缩写到缩写词(例如,“ frgm”到“ fragment”)的大约40万个映射。 使用设备时,读取会经常发生,并且读取时间不应超过15-20ms。

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

CREATE TABLE WordMappings (key text, word text)

该表只创建一次,尽管可以进行更改,但只有读访问权限对时间很重要。

按照本指南 ,我的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个缩写的测试数据库上使用此代码,我无法以比〜60ms更快的速度获取数据,这太慢了。

关于如何使用SQLite改善性能的任何建议,或者其他方法会产生更可喜的结果吗?

您可以通过为其创建索引来加快对key列的查找:

CREATE INDEX kex_index ON WordMappings(key);

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

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

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

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

在具有40万个随机创建的条目(长10/20个字符)的测试表上的单个查询所用的时间不超过5毫秒,这可以满足要求。

现在,表创建如下:

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

使用主键是因为

  • 它是隐式唯一的,是所存储缩写的一个属性
  • 它不能为NULL,因此包含它的行不能为NULL。 在我们的情况下,如果是这样,数据库将损坏

其他用户建议使用索引,但是,它们不一定是唯一的,并且根据对此问题的接受答案 ,它们不必要地减慢了更新/插入/删除性能。 但是,使用索引也可以提高性能。 尽管未经原始作者测试,但这未经原始作者测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM