为什么shelve.sync无法按预期工作?

时间:2020-04-15 15:25:11

标签: python shelve

在下面的示例中,为什么shelve不同步第二个键(world)?我两次调用sync方法来更新数据-但它没有做到-也没有引发异常。这是预期的行为吗?一般来说,我可以依靠同步来始终吗?

我正在评估shelve作为通过保存应用程序的状态(深度嵌套的对象)来减少“内存中”应用程序加载时间的一种选择。

还有,有人知道shelve.sync的时间复杂度是多少?是O(delta),其中detla是发生在深层嵌套对象上的更改吗?

import shelve

example = {}

d = shelve.open("shelve.db", writeback=True)
d["example"] = example

example["hello"] = "hello"
d.sync()
example["world"] = "world"
d.sync()

d.close()

d = shelve.open("shelve.db", writeback=True)
print(d["example"]["hello"])
print(d["example"]["world"])

1 个答案:

答案 0 :(得分:1)

writeback=True架子上有一个高速缓存,用于存储从高速缓存中检索到的对象。从缓存中检索两次检索到的元素,并在关闭或同步架子时使用缓存将更改写回到文件中。

Shelf.sync()将所有缓存条目写回到磁盘上的文件,并清除缓存。架子会忘记所有检索到的对象。对d的进一步更改将不会反映在架子中,并且如果您尝试在同步后再次检索d["example"],则会从架子上重建新的字典,而不是获取{{1} }。

似乎没有一个公共接口可以在不刷新缓存的情况下同步更改。


此外,d重新修改高速缓存中的每个条目,而不管发生了什么更改(不知道有什么变化)(不知道),然后将新的酱菜写回到磁盘上。但是要花很长时间。

相关问题