当存储和检索包含元组列表的数据存储实体时,存储此列表的最有效方法是什么?
当我遇到这个问题时,元组可以是从键值对到日期时间和示例结果,再到 (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/