【问题标题】:Accessing Dictionaries VS Accessing Shelves访问字典 VS 访问书架
【发布时间】:2010-08-04 21:11:32
【问题描述】:

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

dictionary[str(instantiated_class_id_number)].attribute1

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

【问题讨论】:

  • 请注意,如果 ..._id_number 是可散列的(整数是可散列的),则字符串调用完全没有意义。
  • 是的,我知道....我的键是字符串...

标签: python dictionary shelve


【解决方案1】:

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

不同之处在于,当您将类添加到字典时,会存储一个引用,但 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”对象从缓存中丢失,因此不会被写回。

【讨论】:

  • 不完全确定你为什么不赞成这个答案,投票赞成。
【解决方案2】:

是的,是plausible

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

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

编辑

请注意,它不完全是dict。参见例如劳里恩的回答。

哦,你只能拥有str 键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-16
    • 2021-05-06
    • 2015-03-09
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多