1

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

dictionary[str(instantiated_class_id_number)].attribute1

由于内存问题,我想使用该shelve模块。我想知道这样做是否合理。搁置字典的作用与标准字典完全相同吗?如果不是,它有什么不同?

4

2 回答 2

3

Shelve 的行为与字典不同,尤其是在修改字典中已有的对象时。

不同之处在于,当您将类添加到字典时,会存储引用,但搁置保留对象的腌制(序列化)副本。如果您随后修改对象,您将修改内存中的副本,但不会修改腌制版本。这可以(大部分)由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”对象从缓存中丢失,因此不会被写回。

于 2010-08-04T21:40:25.860 回答
0

是的,这是合理的:

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

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

编辑

请注意,它不完全是dict. 参见例如 Laurion 的回答。

哦,你只能有str钥匙。

于 2010-08-04T21:27:33.567 回答