在数据存储中高效存储元组的方法
如果我有一对浮点数,把它们存储为一个 GeoPtProperty
,在计算上或存储上会更有效率吗?还是说把这个元组打包存储为 BlobProperty
更好?
如果 GeoPt
有一些聪明的方式来把多个值放在一个属性里,那这种方式能用来存储任意数据吗?比如我能不能把元组 ("Johnny", 5)
以同样高效的方式存储在一个实体属性里?
2 个回答
0
GeoPt这个东西本身的范围是有限的,具体来说就是纬度在-90到90之间, 经度在-180到180之间;如果你的数据超出了这个范围,就不能用它来存储。
不过,自己创建一个自定义的元组属性应该不算太难;你可以看看aetycoon里是怎么设计SetProperty和ArrayProperty的。
3
这里有一些实际的答案:
GeoPtProperty
占用 31 字节的存储空间。
使用 BlobProperty
的存储空间会根据你存储的内容而不同:
struct.pack('>2f', lat, lon)
=> 21 字节。- 使用 pickle (v2) 来打包一个包含浮点数的 2 元组 => 37 字节。
- 使用 pickle (v0) 来打包一个包含浮点数的 2 元组 => 大约 30 字节到 32 字节(v0 使用变长的 ASCII 编码来表示浮点数)。
总的来说,GeoPt
看起来并没有做什么特别聪明的事情。如果你打算存储很多这样的数据,可以考虑用 struct
来打包你的浮点数。用 struct
来打包和解包它们,可能和使用 GeoPt
的序列化/反序列化在 CPU 上的消耗几乎没有区别。
如果你计划为每个实体存储很多浮点数,并且空间真的很重要,那么你可以考虑使用 CompressedBlobProperty
,这个在 aetycoon 中可以找到。
免责声明:这是每个属性所需的最小空间。实际的空间会因为属性名称的长度而稍微增加。模型本身也会增加一些开销(因为它的名称和键)。