在元数据存储区中存储元组的有效方法

时间:2010-06-09 22:13:57

标签: python google-app-engine google-cloud-datastore

如果我有一对花车,那么将它们存储为GeoPtProperty比将它们腌制成元组并将其存储为BlobProperty更有效(计算或存储) ?

如果GeoPt正在做一些更聪明的事情来保持单个属性中的多个值,那么它是否可以用于任意数据?我可以以同样有效的方式将元组("Johnny", 5)存储在单个实体属性中吗?

2 个答案:

答案 0 :(得分:3)

以下是一些实证答案:

GeoPtProperty使用31B的存储空间。

使用BlobProperty会因您确切存储的内容而异:

  • struct.pack('>2f', lat, lon) => 21B。
  • 使用pickle(v2)打包包含浮点数的2元组=> 37B。
  • 使用pickle(v0)打包包含浮点数的2元组=>大约30B-32B(v0使用浮点数的可变长度ascii编码)。

简而言之,GeoPt看起来并不是特别聪明。如果您要存储大量这些内容,那么您可以使用struct打包浮动内容。使用struct打包和解压缩它们可能与序列化/反序列化GeoPt相关的CPU成本明显不同。

如果您计划为每个实体存储批次浮点数并且空间非常重要,那么您可以考虑利用aetycoon中的CompressedBlobProperty

免责声明:这是所需的最小空间。根据房产名称的长度,每个房产的实际空间会略大一些。模型本身也增加了开销(名称和密钥)。

答案 1 :(得分:0)

GeoPt本身仅限于(-90 - 90,-180 - 180);它不能用于存储任何不适合此模型的数据。

但是,自定义元组属性不应该太难创建;看看如何在aetycoon中设计SetProperty和ArrayProperty。