python - 在 App-Engine 中存储元组列表的最佳方式是什么?

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

当存储和检索包含元组列表的数据存储实体时,存储此列表的最有效方法是什么?

当我遇到这个问题时,元组可以是从键值对到日期时间和示例结果,再到 (x, y) 坐标的任何内容。
元组的数量是可变的,范围从 1 到几百。

包含这些元组的实体需要快速/廉价地引用,并且不需要对元组值进行索引。

我遇到过几次这个问题,并通过多种不同的方式解决了它。

方法一:

将元组值转换为字符串并用一些分隔符将它们连接在一起。

def PutEntity(entity, tuples):
  entity.tuples = ['_'.join(tuple) for tuple in tuples]
  entity.put()

优点:结果在 Datastore Viewer 中很容易读取,一次获取所有内容。 缺点:潜在的精度损失,需要程序员反序列化/序列化,需要更多字节以字符串格式存储数据。

方法二:

将每个元组值存储在列表中并压缩/解压缩元组。

def PutEntity(entity, tuples):
  entity.keys = [tuple[0] for tuple in tuples]
  entity.values = [tuple[1] for tuple in tuples]
  entity.put()

优点:不会损失精度,在数据存储区查看器中查看数据时会造成混淆但仍然可以查看数据,能够强制执行类型,一次获取所有内容。
缺点:程序员需要压缩/解压缩元组或小心维护列表中的顺序。

方法三:

序列化一些庄园 json、pickle、 Protocol Buffer 中的元组列表,并将其存储在 blob 或文本属性中。

优点:可用于对象和更复杂的对象,错误丢失匹配元组值的风险更小。
缺点:Blob 存储访问需要额外的提取?无法在数据存储查看器中查看数据。

方法四:

将元组存储在另一个实体中并保留键列表。

优点:更明显的架构。如果实体是一个 View ,我们不再需要保留两份元组数据。
缺点:需要两次提取,一次用于实体和键列表,一次用于元组。

我想知道是否有人知道哪个表现最好,是否有一种方法我没有想过?

谢谢, 吉姆

最佳答案

我使用方法 3。Blobstore 可能需要额外的提取,但 db.BlobProperty 不需要。对于从存储中取出的对象与放入时完全一样很重要的对象,我使用 PickleProperty(可以在 tipfy 和其他一些实用程序库中找到)。

对于我只需要存储其状态的对象,我编写了一个与 PickleProperty 类似工作的 JsonProperty 函数(但显然使用 SimpleJson)。

对我而言,在一次获取中获取所有数据并防止白痴比 cpu 性能(在 App Engine 中)更重要。根据关于 AppStats 的 Google I/O 演讲,访问数据存储几乎总是比一些本地解析更昂贵。

关于python - 在 App-Engine 中存储元组列表的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5044653/

相关文章:

google-app-engine - Golang - 格式化和存储后时间戳丢失一年

google-app-engine - Google App Engine : close . put() 和 .get() 竞争条件?

security - 在 App Engine 上加密用户数据

python - 属性错误: 'kivy.properties.ObjectProperty' object has no attribute 'text'

python - 根据向量类型元素获取numpy数组的掩码

java - Maven + GAE 一步一步

java - 如何获取 Google Cloud Datastore 中某种实体的总数

python - 在 Django 中将固定装置加载到数据库后如何延迟评估 ORM 调用?

python - 如何使用 Python 从 lxml 元素获取原始文本

java - 如何在 App Engine 项目中禁用 SystemServiceServlet 配置?