在Python中使用pickle高效地访问字典中的项

在Python中使用pickle高效地访问字典中的项,python,pickle,Python,Pickle,我有一个很大的字典将键(字符串)映射到对象。我把这本大词典翻了个底朝天,有时我只想从中找出一小部分词条。这本词典通常共有数千条词条。当我使用pickle加载字典时,如下所示: from cPickle import * # my dictionary from pickle, containing thousands of entries mydict = open(load('mypickle.pickle')) # accessing only handful of entries here

我有一个很大的字典将键(字符串)映射到对象。我把这本大词典翻了个底朝天,有时我只想从中找出一小部分词条。这本词典通常共有数千条词条。当我使用pickle加载字典时,如下所示:

from cPickle import *
# my dictionary from pickle, containing thousands of entries
mydict = open(load('mypickle.pickle'))
# accessing only handful of entries here
for entry in relevant_entries:
  # find relevant entry
  value = mydict[entry]
我注意到加载整个pickle可能需要3-4秒,我不需要,因为我以后只访问字典条目的一小部分(如上所示)

我怎样才能使pickle只加载我从字典中得到的那些条目,从而使它更快

谢谢

您必须拥有“重影”对象,即仅为占位符的对象,在访问时加载它们自己。这是一个困难的问题,但已经解决了。你有两个选择。您可以使用ZODB中的持久性库,这有助于实现这一点。或者,直接开始使用ZODB;问题解决了


Pickle序列化对象(层次结构),它不是磁盘存储。正如您所看到的,您必须解开整个对象才能使用它——这当然是浪费。使用或数据库()进行磁盘存储。

如果对象彼此独立,则可以使用它们的键作为文件名分别对它们进行pickle和unpickle,某种反常的方式是,目录是一种将文件名映射到文件的字典。这样,只加载相关条目就很简单了

基本上,您使用内存字典作为缓存,如果缺少搜索的键,请尝试从文件系统加载该文件


我不是说你应该那样做。数据库(ZODB、SQLite、other)可能更适合持久性存储。

这不是pickle的设计目的;如果你想要一个数据库,就使用数据库。这不是一种用更糟糕的问题来代替问题的方法吗?ZODB并不是那么简单+1 anywayZODB当然需要一些工作来设置,但是它非常容易使用,并且解决了这个问题。您可以拥有许多GB的数据,而不会出现任何问题。ZODB真是太棒了。我同意你的看法,太棒了。我只是指出入场券不是免费的。但这是一个很好的代价。