我使用Python2.7的dumbdbm
,但这个问题也适用于Python3的dbm.dumb
。python dumbdbm,数据何时写回磁盘?
文档说:
dumbdbm.sync()
同步磁盘上的目录和数据文件。此方法由Shelve对象的sync()方法调用。
我有三个问题:
我使用Python2.7的dumbdbm
,但这个问题也适用于Python3的dbm.dumb
。python dumbdbm,数据何时写回磁盘?
文档说:
dumbdbm.sync()
同步磁盘上的目录和数据文件。此方法由Shelve对象的sync()方法调用。
我有三个问题:
一个—也许是最好的,如果不仅—的方式来回答这样没有具体的文档中解决的问题就是阅读源代码(当它可用,因为它是在这里)。
的dumbdbm.py
文件应该在你的/Python/Lib
目录中,也可以在网上通过浏览器中的水银源代码版本控制系统在浏览:
https://hg.python.org/cpython/file/2.7/Lib/dumbdbm.py
首先要注意是在私人_Database
类—这是什么dumbdbm
数据库真的是—开始的长期评论,因为它似乎通常处理似乎是什么您的问题的整体主题:
class _Database(UserDict.DictMixin):
# The on-disk directory and data files can remain in mutually
# inconsistent states for an arbitrarily long time (see comments
# at the end of __setitem__). This is only repaired when _commit()
# gets called. One place _commit() gets called is from __del__(),
# and if that occurs at program shutdown time, module globals may
# already have gotten rebound to None. Since it's crucial that
# _commit() finish successfully, we can't ignore shutdown races
# here, and _commit() must not reference any globals.
有关特定方法的深入信息可以通过阅读它们的源代码找到。鉴于此,这里就是我想回答您的问题将是Python的2.7版本:
如果我不叫sync
,将磁盘文件得到更新?
从前面的评论,它听起来像只要你的程序优雅地关闭。
除此之外,它取决于已被调用的方法。有些可能,但只是部分。例如,它看起来像__setitem__()
,具体取决于项目是用于全新的密钥还是现有的密钥。对于后一种情况有在部分结束与他们的交易才说(意识到_commit()
是sync()
只是另一个名字)评论:
注意
_index
可能是出于与现在的目录文件同步的:_setval()
和_addval()
不更新目录文件。这也意味着磁盘上的目录和数据文件处于相互不一致的状态,并且它们将保持这种状态,直到调用_commit()
为 。请注意,如果 程序崩溃(因此_commit()
永远不会被调用),这是一个灾难(对于数据库)。
而且,这种功能始终将数据写回磁盘,而不是逆?
sync()
/_commit()
不会出现任何数据加载回从磁盘存储器。
如果我打电话给close
怎么办?
close()
只是调用_commit()
,然后将所有内部数据结构来None
,防止任何进一步的数据库操作。
总之,对于这里的元主题有点幽默,我建议你阅读Learn to Read the Source, Luke。
你可以很容易地编写代码来尝试这些 - 你做过吗? – barny
将数据写回磁盘的反作用是什么? – martineau
@martineau'反向'我的意思是从磁盘加载数据到内存。 – laike9m