2011-02-18 38 views
10

當存儲和檢索包含元組列表的數據存儲實體時,存儲此列表的最有效方式是什麼?在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中的另一個實體元組和保持鍵的列表。

優點:更明顯的架構。如果實體是一個視圖,我們不再需要保留元組數據的兩個副本。
缺點:兩次提取需要一個用於實體和密鑰列表,一個用於元組。

我想知道如果有人知道哪一個表現最好,如果有一種方式我沒有想過?

感謝, 吉姆

回答

5

我使用方法3 Blob存儲可能需要額外的提取,但db.BlobProperty沒有。對於那些重要的對象來說,它與存儲的內容完全一樣,我使用PickleProperty(可以在Tipfy和其他一些實用程序庫中找到)。

對於我只需要存儲它的狀態的對象,我寫了一個類似於PickleProperty的JsonProperty函數(但顯然使用SimpleJson)。

對於我來說,在一次獲取中獲取所有數據,並且是傻瓜式的,比CPU性能(在App Engine中)更重要。根據AppStats上的Google I/O談話,到數據存儲區的旅程幾乎總是會比本地解析更昂貴。

+0

我傾向於將方法3與PickleProperty一起使用,但有時沒有通過數據存儲查看器查看實體的選項,這可能會很痛苦。 – systempuntoout

相關問題