我有一本大的字典,其格式如下:

dict["randomKey"]=[dict1,dict2,int,string]


可能会有数万个键。 dict1本身具有〜100个键。

问题是:我需要将此字典存储在服务器上并由多台机器读取。最好的格式是什么?

我现在使用的是非常容易使用的shelve
但是,我将需要从主词典(dict)中获取所有键,以获取dict1dict2中某个键的某个值,这会花费一些时间,而且恐怕该词典何时会发布。更大,例如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/

10-11 04:36
查看更多