目前,我有具有许多作为密钥和一类作为值的字典。我可以访问类的属性,像这样:

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密钥。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top