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

2024-10-04 05:29:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前面临的问题是必须经常在一个小型(700兆赫)设备上实时访问一个大而简单的数据集。数据集包含大约400000个从缩写到缩写词的映射,例如从“frgm”到“fragm”。在使用设备时,会频繁地进行读取,且不应超过15-20ms

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

CREATE TABLE WordMappings (key text, word text)

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

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

^{pr2}$

然而,在一个包含20000个缩写的测试数据库上使用这段代码,我无法以大约60ms的速度获取数据,这太慢了。在

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


Tags: 数据key字符串text数据库利用sqlitecreate
3条回答

结果表明,定义主键可以将单个查询的速度提高一个数量级。在

对于一个包含400000个随机创建的条目(10/20个字符长)的测试表,单个查询所用时间不超过5ms,满足要求。在

该表现在创建如下:

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

使用主键是因为

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

其他用户建议使用索引,但是,索引不一定是唯一的,而且根据the accept answer to this question,它们不必要地降低更新/插入/删除性能。然而,使用索引也可以提高性能。然而,这一点没有经过原作者的检验,虽然没有经过原作者的检验。在

通过为key列创建索引,可以加快对该列的查找:

CREATE INDEX kex_index ON WordMappings(key);

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

很久以前,我尝试使用SQLite来处理顺序数据,但它不够快,不能满足我的需要。当时,我正在将它与一个现有的内部二进制格式进行比较,最后我使用了这种格式。在

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

相关问题 更多 >