Python 由字典组成的数据库的正确选择
我有一本大词典,其格式如下:Python 由字典组成的数据库的正确选择,python,sqlite,dictionary,shelve,Python,Sqlite,Dictionary,Shelve,我有一本大词典,其格式如下: dict["randomKey"]=[dict1,dict2,int,string] 可能会有几万把钥匙dict1本身有大约100个键 问题是:我需要将这本词典存储在服务器上,并由多台机器读取。这个的最佳格式是什么 我现在使用的是非常容易使用的shelve。 但是,我需要从主字典(dict)中获取所有键,以便从dict1或dict2中获取某个键的特定值,这需要一些时间,而且我担心当字典变得更大时,就像50k键一样,这将花费永远的时间。 我读过关于sqlite3的文
dict["randomKey"]=[dict1,dict2,int,string]
可能会有几万把钥匙dict1
本身有大约100个键
问题是:我需要将这本词典存储在服务器上,并由多台机器读取。这个的最佳格式是什么
我现在使用的是非常容易使用的shelve
。
但是,我需要从主字典(dict)中获取所有键,以便从dict1
或dict2
中获取某个键的特定值,这需要一些时间,而且我担心当字典变得更大时,就像50k键一样,这将花费永远的时间。
我读过关于sqlite3的文章,它似乎是一个不错的选择,但我不知道它是否适合我的需要
除了Python程序之外,我并不需要数据库能够被其他程序访问(尽管这会很好),但我需要它快速、稳定,并且能够让多台计算机同时从中读取数据。谢谢 我会选择一个支持原生json的数据库,它可以高效地在json字典中搜索。我喜欢PostgreSQL: 数据表:
create table dict (
key text primary key,
dict1 jsonb not null default '{}',
dict2 jsonb not null default '{}',
intval integer not null,
strval text not null
);
用一些示例值填充它:
insert into dict
select
i::text,
(select
jsonb_object(
array_agg('k'||v::text),
array_agg('v'||(v+i)::text)
) from generate_series(1,1000) as v
),
(select
jsonb_object(
array_agg('k'||v::text),
array_agg('v'||(v+i)::text)
) from generate_series(1,1000) as v
),
i,
i::text
from generate_series(1,10000) as i;
在dict1
中获取键k6
有值的键v134
:
select key from dict where dict1 @> '{"k6":"v134"}';
key
-----
128
(1 row)
Time: 232.843 ms
如果您的表非常大,您甚至可以为字典列编制索引,以便更快地进行搜索。但这些索引将比表本身大,数据库可以决定无论如何不使用它们更安全:
create index dict_dict1_idx on dict using gin(dict1);
create index dict_dict2_idx on dict using gin(dict2);
您可以强制数据库使用索引,如果您知道这是有益的:
set enable_seqscan=off;
select key from dict where dict1 @> '{"k6":"v134"}';
key
-----
128
(1 row)
Time: 8.955 ms
与SQL相比,文档数据库可能更适合您的需要。我做了一些研究,但我真的不知道。。。根据您的经验,sqlite和postgresql之间是否存在显著差异?答案是thx,我想说,它们就像脚踏车和18轮卡车一样。