2012-05-15 25 views
1

我想以模塊化的方式執行一些對象圖的序列化。那是我不想序列化整個圖。原因是這張圖很大。我可以保留圖的某些部分的時間戳版本,並且我可以做一些懶惰的訪問來推遲加載我現在不需要的部分。pickle模塊化序列化(Python)

我想我可以用Python中的元編程來管理這個。但似乎元編程在Python中不夠強大。

這就是我現在所做的。我的圖由幾個不同的對象組成。其中一些是特殊班的實例。這個類描述了被醃製的根對象。這就是模塊化的地方。每當我嘗試從其中一個實例開始的東西時,我就不會同時醃製其中的兩個。每當有一個對根對象可訪問的另一個實例的引用時,我用persistant_id替換這個引用,從而確保我在相同的酸洗流中不會有兩個它們。取消流時會出現問題。我可以找到一個尚未加載的實例的persistant_id。當出現這種情況時,我必須等待目標實例在允許訪問之前被加載。而且我也看不出去那麼做:

1 /我試圖建立一個訪問器,其中得到方法返回參考的目標。不幸的是,訪問者必須放在類聲明中,我不能將它們分配給未被阻止的對象。 2 /我可以存儲需要解析引用的地方。我不認爲這在Python中是可能的:不能保持對某個地方(一個字段或一個變量)的引用,只能對一個值進行引用。

我的問題可能不明確。我仍在尋找一個清晰的表述。我嘗試了其他的東西,比如使用明確的引用,這些引用會是一些「引用」類的實例。雖然這不是很方便。

你有什麼想法如何實現與泡菜模塊序列化?我是否必須改變Unpickler的內部行爲才能記住需要加載剩餘對象圖的地方?是否有另一個圖書館更適合取得類似的成果?

回答

0

以下是我認爲我會這樣做的方式。

  1. 有一個模塊級字典映射persistent_id到SpecialClass對象。每次初始化或取消選中某個實例時,請確保將其添加到字典中。

  2. 覆蓋SpecialClass的__getattr____setattr__方法,使specialobj.foo = anotherspecialobj只存儲在specialobj字典的persistent_id(姑且稱之爲specialobj.specialrefs)。當您檢索specialobj.foo時,它會在specialrefs中找到該名稱,然後在模塊級字典中查找該引用。

  3. 有一個模塊級別check_graph函數將會通過已知的SpecialClass實例並檢查它們的所有specialrefs是否可用。

+0

問題是它只要求Specialclass實例可以擁有對其他實例的引用。這不是我的情況。例如,您的對象中不能包含實例列表。 –

0

元編程是在Python強; Python類非常有延展性。儘管最好在元類(裝飾器)中完成,但可以在完成聲明後更改它們。更重要的是,實例是可延展的,獨立於它們的類。

「對一個地方的引用」通常只是一個字符串。例如。對象字段的引用是它的名字。假設您的節點對象中有多個節點引用。你可以像{persistent_id: (object, field_name),..}這樣的東西作爲你未解決的參考表,很容易查找。類似地,在節點列表中,「引用地點」是索引。

順便說一句,你可以使用鍵值數據庫的圖形存儲?你可以通過ID來拉節點而無需等待。

+0

我不是Python的專家。我如何檢索被醃製的字段的名稱?爲了回答你的問題,在我的情況下,每個「特殊類」實例都有一個唯一的整數ID,並位於由擴展名處理的鍵值數據庫中。 –