簡體   English   中英

使用pickle進行模塊化序列化(Python)

[英]Modular serialization with pickle (Python)

我想以模塊化方式對某些對象圖進行序列化。 那就是我不想序列化整個圖。 原因是該圖很大。 我可以保留該圖某些部分的帶有時間戳的版本,並且可以懶惰地訪問我現在不需要的部分的延遲加載。

我以為我可以使用Python中的元編程來解決這個問題。 但是似乎元編程在Python中不夠強大。

這是我現在所做的。 我的圖由幾個不同的對象組成。 其中一些是特殊類的實例。 此類描述了要腌制的根對象。 這就是模塊性的所在。每次我腌制某種東西時,它們都是從這些實例之一開始的,而我從不會同時腌制其中的兩個實例。 每當有對另一個實例的引用(可由根對象訪問)時,我都會用persistant_id替換該引用,從而確保在相同的酸洗流中不會有兩個實例。 當解流流時出現問題。 我可以找到尚未加載的實例的persistant_id。 在這種情況下,我必須等待目標實例加載后才允許對其進行訪問。 而且我看不到要這樣做:

1 /我試圖構建一個訪問器,該訪問器的get方法返回引用的目標。 不幸的是,訪問器必須放在類聲明中,我不能將它們分配給未選擇的對象。 2 /我可以將引用存儲在需要解析的地方。 我認為這在Python中是不可能的:不能保留對位置(字段或變量)的引用,只能保留對值的引用。

我的問題可能不清楚。 我仍在尋找明確的表述。 我嘗試了其他事情,例如使用顯式引用,這將是某些“ Reference”類的實例。 雖然不是很方便。

您有任何想法如何使用pickle實現模塊化序列化嗎? 我是否必須更改Unpickler的內部行為才能記住我需要加載其余對象圖的地方? 是否有另一個更適合實現類似結果的庫?

我想這就是我要做的。

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

  2. 重寫SpecialClass的__getattr____setattr__方法,以便specialobj.foo = anotherspecialobj僅將一個persistent_id存儲在specialobj的字典中(我們將其specialobj.specialrefs )。 檢索specialobj.foo ,它將在specialobj.foo找到名稱,然后在模塊級字典中找到引用。

  3. 具有模塊級別的check_graph函數,該函數將遍歷已知的SpecialClass實例並檢查其所有specialrefs是否可用。

元編程在Python中強大; Python類非常具有延展性。 盡管最好在元類(裝飾器)中完成操作,但是可以在聲明后完全更改它們。 除此之外, 實例是可延展的,與類無關。

“對位置的引用”通常只是一個字符串。 例如,對對象字段的引用就是其名稱。 假設您的節點對象中有多個節點引用。 您可能有類似{persistent_id: (object, field_name),..}作為未解析的引用表,易於查找。 同樣,在節點列表中,“對位置的引用”是索引。

順便說一句,您可以使用鍵值數據庫進行圖形存儲嗎? 您無需等待即可按ID拉節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM