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

6 投票
3 回答
2513 浏览
提问于 2025-04-16 08:55

我有一个很大的字典,这个字典是用字符串作为键,映射到一些对象上。我把这个大字典进行了序列化(也就是用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只加载我需要的那些条目,这样可以加快速度呢?

谢谢。

3 个回答

2

你需要有“幽灵”对象,也就是那些只是占位符的对象,只有在被访问时才会加载自己。这是一个比较棘手的问题,但已经有了解决办法。你有两个选择。你可以使用ZODB的持久化库,它可以帮助你解决这个问题。或者,你也可以直接开始使用ZODB,这样问题就解决了。

http://www.zodb.org/

3

Pickle 是一种把对象(包括对象之间的层级关系)转换成可以存储的格式的方法,但它并不是一种可以直接在硬盘上存储数据的工具。正如你所看到的,要使用这些对象,你必须把整个对象都解码回来,这样做其实很浪费。如果你想要在硬盘上存储数据,可以使用 shelvedbm 或者数据库(比如 SQLite)。

0

如果你的对象之间是相互独立的,你可以把它们单独保存和读取,使用它们的键作为文件名。可以说,文件夹在某种程度上就像一个字典,把文件名和文件对应起来。这样的话,你就可以很简单地只加载相关的内容。

基本上,你可以把内存中的字典当作缓存,如果你要找的键不在里面,就去文件系统中加载相应的文件。

我并不是说你一定要这么做。其实使用数据库(比如ZODB、SQLite等)来存储数据可能会更好。

撰写回答