题
目前,我有具有许多作为密钥和一类作为值的字典。我可以访问类的属性,像这样:
dictionary[str(instantiated_class_id_number)].attribute1
由于内存的问题,我想用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”对象从缓存,以便不写回丢失。
其他提示
是,它是似是而非:
保质对象支持由字典支持的所有方法。这简化了从基于字典的脚本那些需要持久存储的过渡。
您需要每隔一段时间打电话shelf.sync()
来清除缓存。
修改
保重,它不完全是一个dict
。例如见Laurion的答案。
哦,你只能有str
密钥。
不隶属于 StackOverflow