2015-08-25 121 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