我使用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