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

5 投票
2 回答
1112 浏览
提问于 2025-04-15 23:46

如果我有一对浮点数,把它们存储为一个 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 中可以找到。

免责声明:这是每个属性所需的最小空间。实际的空间会因为属性名称的长度而稍微增加。模型本身也会增加一些开销(因为它的名称和键)。

撰写回答