2010-06-09 136 views
5

如果我有一對浮點數,它是否更有效(計算或存儲方式)將它們存儲爲GeoPtProperty比它將pickle元組並將其存儲爲BlobProperty在數據存儲中存儲元組的有效方法

如果GeoPt正在做更聰明的事情來將多個值保存在一個屬性中,它是否可以用於任意數據?我能否以同樣有效的方式將元組("Johnny", 5)存儲在單個實體屬性中?

回答

3

這裏有一些實證的答案:

GeoPtProperty使用的存儲空間31B。

使用BlobProperty變化的基礎上你存儲什麼:

  • struct.pack('>2f', lat, lon) => 21B。
  • 使用pickle(v2)打包包含浮點數=> 37B的2元組。
  • 使用pickle(v0)打包一個包含浮點數的二元組=>大約30B-32B(v0使用浮點數的可變長度ascii編碼)。

簡而言之,它看起來不像GeoPt是在做任何特別聰明的事情。如果你要存儲很多這些,那麼你可以使用struct來打包你的浮點數。使用struct對它們進行打包和解壓縮可能與序列化/反序列化GeoPt相關的CPU成本不同。

如果您計劃在存儲大量的每個實體和空間花車是非常重要的,那麼你可以考慮借力CompressedBlobPropertyaetycoon

免責聲明:這是所需的最小空間。根據酒店名稱的長短,每間酒店的實際空間會稍大一些。模型本身也增加了開銷(對於它的名字和關鍵字)。

+0

爲了好玩......「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

+0

您的分析沒有考慮CPU時間 - 酸洗和去除通常在計算上非常昂貴。不過,使用結構是個好主意。 AETycoon新增的ArrayProperty也值得一看。 – 2010-06-10 09:29:41

0

GeoPt本身僅限於(-90-90,-180-180);它不能用於存儲任何不適合此模型的數據。

但是,自定義元組屬性不應該太難以創建自己;看看如何在aetycoon中設計SetProperty和ArrayProperty。

相關問題