當存儲和檢索包含元組列表的數據存儲實體時,存儲此列表的最有效方式是什麼?在App-Engine中存儲元組列表的最高性能方法是什麼?
當我遇到這個問題時,元組可以是從鍵值對到日期時間和樣本結果到(x,y)座標的任何東西。
元組的數量是可變的,範圍從1到幾百。
包含這些元組的實體需要快速/便宜地引用,並且不需要對元組值進行索引。
我有這個問題幾次,並已解決了它的許多不同的方式。
方法1:
轉換的元組值的字符串,並與一些分隔符一起將它們連接起來。
def PutEntity(entity, tuples):
entity.tuples = ['_'.join(tuple) for tuple in tuples]
entity.put()
優點:結果是在數據存儲瀏覽器易於閱讀,一切都在一個GET牽強。 缺點:潛在的精度損失,反序列化/序列化所需的編程器,以字符串格式存儲數據所需的更多字節。
方法2:
存放於列表和zip每個元組值/解壓縮元組。
def PutEntity(entity, tuples):
entity.keys = [tuple[0] for tuple in tuples]
entity.values = [tuple[1] for tuple in tuples]
entity.put()
優點:精度不丟失,混亂,但仍然可以查看數據存儲的觀衆數據,能夠執行類型的,一切都在一個GET牽強。
缺點:程序員需要壓縮/解壓縮元組或仔細維護列表中的順序。
方法3:
序列化的元組的列表在一些莊園JSON,鹹菜,協議緩衝區並將其存儲在一個blob或文本屬性。
優點:可用於對象和更復雜的對象,減少錯誤匹配元組值的風險。
缺點: Blob存儲訪問需要額外的提取?,無法查看數據存儲查看器中的數據。
方法4:
Store中的另一個實體元組和保持鍵的列表。
優點:更明顯的架構。如果實體是一個視圖,我們不再需要保留元組數據的兩個副本。
缺點:兩次提取需要一個用於實體和密鑰列表,一個用於元組。
我想知道如果有人知道哪一個表現最好,如果有一種方式我沒有想過?
感謝, 吉姆
我傾向於將方法3與PickleProperty一起使用,但有時沒有通過數據存儲查看器查看實體的選項,這可能會很痛苦。 – systempuntoout