如果我有一對浮點數,它是否更有效(計算或存儲方式)將它們存儲爲GeoPtProperty
比它將pickle元組並將其存儲爲BlobProperty
?在數據存儲中存儲元組的有效方法
如果GeoPt
正在做更聰明的事情來將多個值保存在一個屬性中,它是否可以用於任意數據?我能否以同樣有效的方式將元組("Johnny", 5)
存儲在單個實體屬性中?
如果我有一對浮點數,它是否更有效(計算或存儲方式)將它們存儲爲GeoPtProperty
比它將pickle元組並將其存儲爲BlobProperty
?在數據存儲中存儲元組的有效方法
如果GeoPt
正在做更聰明的事情來將多個值保存在一個屬性中,它是否可以用於任意數據?我能否以同樣有效的方式將元組("Johnny", 5)
存儲在單個實體屬性中?
這裏有一些實證的答案:
GeoPtProperty
使用的存儲空間31B。
使用BlobProperty
變化的基礎上你存儲什麼:
struct.pack('>2f', lat, lon)
=> 21B。簡而言之,它看起來不像GeoPt
是在做任何特別聰明的事情。如果你要存儲很多這些,那麼你可以使用struct
來打包你的浮點數。使用struct
對它們進行打包和解壓縮可能與序列化/反序列化GeoPt
相關的CPU成本不同。
如果您計劃在存儲大量的每個實體和空間花車是非常重要的,那麼你可以考慮借力CompressedBlobProperty
在aetycoon。
免責聲明:這是所需的最小空間。根據酒店名稱的長短,每間酒店的實際空間會稍大一些。模型本身也增加了開銷(對於它的名字和關鍵字)。
GeoPt本身僅限於(-90-90,-180-180);它不能用於存儲任何不適合此模型的數據。
但是,自定義元組屬性不應該太難以創建自己;看看如何在aetycoon中設計SetProperty和ArrayProperty。
爲了好玩......「GeoPt」似乎被存儲爲「點」值。具體來說,數據本身似乎需要18B - 兩個1字節整數和兩個8字節雙精度(請參見[這裏](http://code.google.com/p/googleappengine/source/browse/trunk/python/google /appengine/datastore/entity_pb.py#215)),共18個字節。 'struct'解決方案將每個浮點數打包爲4個字節,總共8個字節。因此,兩者都有來自我上面測試的其餘屬性信息的13B「額外開銷」(開銷預計相同,因爲我的測試之間唯一不同的是屬性類型)。 – 2010-06-09 23:34:25
您的分析沒有考慮CPU時間 - 酸洗和去除通常在計算上非常昂貴。不過,使用結構是個好主意。 AETycoon新增的ArrayProperty也值得一看。 – 2010-06-10 09:29:41