访问字典与访问货架
目前,我有一个字典,这个字典的键是数字,值是一个类(Class)。我可以这样访问那个类的属性:
dictionary[str(instantiated_class_id_number)].attribute1
因为内存的问题,我想使用 shelve
模块。我在想这样做是否可行。shelve 字典和普通字典的作用完全一样吗?如果不一样,它们有什么不同呢?
2 个回答
0
是的,这个说法是有道理的:
Shelf对象支持字典的所有方法。这让从使用字典的脚本转到需要持久存储的脚本变得更简单。
你需要定期调用 shelf.sync()
来清理缓存。
编辑
要注意,它并不完全等同于 dict
。可以参考Laurion的回答。
哦,对了,你只能使用 str
类型的键。
3
Shelve的行为和字典不完全一样,特别是在修改已经存在于字典中的对象时。
它们的区别在于,当你把一个类添加到字典时,字典里存的是这个对象的引用;而shelve则保存了这个对象的一个“打包”(序列化)副本。如果你之后修改了这个对象,你修改的是内存中的副本,而不是那个打包的版本。这个过程可以通过shelf.sync()
和shelf.close()
来处理,它们会把条目写回去。不过,要让这一切正常工作,你需要跟踪所有还没有写回的对象,所以你必须调用shelf.sync()来清理缓存。
使用shelf.sync()
清理缓存的问题在于,你可能会保留对这个对象的引用,并再次修改它。
这段代码在使用shelve时不会按预期工作,但在使用字典时会正常运行:
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
Sync会清空缓存,所以修改后的'p'对象会从缓存中丢失,因此不会被写回。