2015-08-25 131 views
0

我使用Python2.7的dumbdbm,但这个问题也适用于Python3的dbm.dumbpython dumbdbm,数据何时写回磁盘?

文档说:

dumbdbm.sync()
同步磁盘上的目录和数据文件。此方法由Shelve对象的sync()方法调用。

我有三个问题:

  1. 如果我不叫sync,将磁盘文件得到更新?
  2. 而且这个函数总是把数据写回磁盘,而不是反向?
  3. 如果我拨打close怎么办?
+1

你可以很容易地编写代码来尝试这些 - 你做过吗? – barny

+0

将数据写回磁盘的反作用是什么? – martineau

+0

@martineau'反向'我的意思是从磁盘加载数据到内存。 – laike9m

回答

1

一个—也许是最好的,如果不仅—的方式来回答这样没有具体的文档中解决的问题就是阅读源代码(当它可用,因为它是在这里)。

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版本:

  1. 如果我不叫sync,将磁盘文件得到更新?

    从前面的评论,它听起来像只要你的程序优雅地关闭。

    除此之外,它取决于已被调用的方法。有些可能,但只是部分。例如,它看起来像__setitem__(),具体取决于项目是用于全新的密钥还是现有的密钥。对于后一种情况有在部分结束与他们的交易才说(意识到_commit()sync()只是另一个名字)评论:

    注意_index可能是出于与现在的目录文件同步的: _setval()_addval()不更新目录文件。这也意味着磁盘上的目录和数据文件处于相互不一致的状态,并且它们将保持这种状态,直到调用_commit()为 。请注意,如果 程序崩溃(因此_commit()永远不会被调用),这是一个灾难(对于数据库)。

  2. 而且,这种功能始终将数据写回磁盘,而不是逆?

    sync()/_commit()不会出现任何数据加载回从磁盘存储器。

  3. 如果我打电话给close怎么办?

    close()只是调用_commit(),然后将所有内部数据结构来None,防止任何进一步的数据库操作。

总之,对于这里的元主题有点幽默,我建议你阅读Learn to Read the Source, Luke