我有一本大的字典,其格式如下:
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;
获取
v134
中的键k6
的值为dict1
的键: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
关于python - 由字典组成的数据库的正确选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43468755/