访问词典VS访问货架

时间:2010-08-04 21:11:32

标签: python dictionary shelve

目前,我有一个字典,其中一个数字作为键,一个Class作为值。我可以这样访问该类的属性:

dictionary[str(instantiated_class_id_number)].attribute1

由于内存问题,我想使用shelve模块。我想知道这样做是否合情合理。搁架词典的行为与标准词典完全相同吗?如果没有,它有何不同?

2 个答案:

答案 0 :(得分:2)

Shelve与词典的行为不同,特别是在修改已经在词典中的对象时。

不同之处在于,当您向字典添加类时,会存储引用,但shelve会保留该对象的pickle(序列化)副本。如果您随后修改了对象 修改内存中的副本,但不修改pickle版本。这可以通过shelf.sync()shelf.close()(大部分)透明地处理, 写出条目。完成所有工作确实需要跟踪尚未写回的所有检索对象,因此您必须调用shelf.sync()来清除缓存。

shelf.sync()清除缓存的问题是您可以保留对该对象的引用并再次修改它。

此代码无法按预期使用支架,但可以使用字典:

s["foo"] = MyClass()
s["foo"].X = 8 
p = s["foo"] # store a reference to the object
p.X = 9 # update the reference
s.sync() # flushes the cache
p.X = 0
print "value in memory: %d" % p.X # prints 0
print "value in shelf: %d" % s["foo"].X # prints 9

同步刷新缓存,以便修改后的“p”对象从缓存中丢失,因此不会被回写。

答案 1 :(得分:0)

是的,它是plausible

  

Shelf对象支持字典支持的所有方法。这简化了从基于字典的脚本到需要持久存储的脚本的转换。

您需要经常调用shelf.sync()来清除缓存。

修改

小心,这不完全是dict。参见例如劳里昂的回答。

哦,你只能拥有str个密钥。