目前,我有一个字典,其中一个数字作为键,一个Class作为值。我可以这样访问该类的属性:
dictionary[str(instantiated_class_id_number)].attribute1
由于内存问题,我想使用shelve
模块。我想知道这样做是否合情合理。搁架词典的行为与标准词典完全相同吗?如果没有,它有何不同?
答案 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
个密钥。