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轮卡车一样。