2014-02-12 14 views
0

我有最好用樹表示的數據。對結構進行序列化是最有意義的,因爲我不想每次都對其進行排序,並且可以對數據進行持續修改。可以通過不同的進程同時訪問序列化的對象,並且如果這樣的話他們的行爲如何?

另一方面,這棵樹將從不同的機器上的不同進程訪問,所以我很擔心讀寫的細節。基本搜索沒有太多關於這個話題。

  1. 如果兩個用戶同時嘗試恢復樹並從中讀取它們,它們都可以立即提供服務,還是一個任意先發生?
  2. 如果兩個用戶打開樹(假設他們可以)並且一個進行編輯,另一個用戶是否看到實施的更改? (我假設他們並不是因爲他們每個人都收到了原始數據的副本)。
  3. 如果兩個用戶同時更改對象並關閉它,那麼又是先來過還是先嚐試爲了同時做出這兩項變更?

我在考慮讓一個變化隊列應用到樹上,然後讓樹按照提交順序執行它們。我想在解決任何問題之前我會問我的問題是什麼。

回答

1

沒有想出來我相當肯定的答案是:

  1. 他們既可以一次性投放,但是,如果一個用戶,而另一種是寫讀用戶可能會得到奇怪的結果閱讀。
  2. 可能不是。一旦將樹從文件讀入內存,其他用戶將看不到第一個用戶的編輯。如果沒有從文件中讀取樹,則仍然會檢測到更改。
  3. 這兩個更改將同時進行,文件可能會損壞。

另外,你提到擱置。從擱置文檔:

擱置模塊不支持對擱置對象的併發讀取/寫入訪問。 (多個同時讀取訪問是安全的。)當一個程序有一個可以寫入的架子時,沒有其他程序應該打開它來讀取或寫入。 Unix文件鎖定可以用來解決這個問題,但是這在Unix版本中是不同的,並且需要關於所使用的數據庫實現的知識 。

就個人而言,在這一點上,您可能希望使用像Redis這樣的簡單鍵值存儲來進行某種樂觀鎖定。

0

您可能會嘗試klepto,它提供了一個SQL數據庫的字典界面(使用sqlalchemy)。如果您選擇將數據保存到mysqlpostgresql或其他可用數據庫(除sqlite之外),則可以讓兩個或更多人同時訪問數據或讓兩個線程/進程訪問數據庫表 - 並讓數據庫數據庫管理併發讀寫。使用klepto與數據庫後端將在併發訪問下執行,以及您是否直接訪問數據庫。如果您不想使用數據庫後端,則klepto也可以寫入磁盤 - 但寫入磁盤時可能會發生衝突 - 即使klepto使用「寫入時複製,然後替換」策略在使用磁盤上的文件時最大限度地減少併發衝突。在使用文件(或目錄)後端時,由於策略klepto用於保存對磁盤的寫入,因此仍會處理1-2-3的問題。此外,klepto可以使用內存緩存層,以實現快速訪問,其中磁盤(或數據庫)後端的加載/轉儲按需執行,或者當內存中的緩存達到用戶確定的大小時執行。

具體來說:(1)兩者同時服務。 (2)如果一個用戶進行編輯,另一個用戶看到更改 - 但是如果第二個用戶正在使用內存中緩存層,則該更改可能會「延遲」。 (3)多個同時寫入不是問題,因爲klepto讓NFS或sql數據庫處理「寫時複製,然後替換」更改。

klepto.archvives字典接口處還在於提供LRU緩存(和LFU等)一個裝飾形式提供,所以如果你有一個正在生成/訪問數據,掛鉤存檔的功能是很容易的 - 您可以使用磁盤或數據庫後端進行記憶。

隨着klepto,你可以選擇幾種不同的序列化方法來加密你的數據。你可以使用klepto將數據強制轉換爲字符串,或使用散列算法(如md5)或使用pickler(如json,pickledill)。

您可以在此處獲得kleptohttps://github.com/uqfoundation/klepto

相關問題