存储和检索包含元组列表的数据存储区实体时,存储此列表的最有效方法是什么?
当我遇到这个问题时,元组可以是从键值对到日期时间和样本结果到(x,y)坐标的任何东西。 元组的数量是可变的,范围从1到几百。
包含这些元组的实体需要快速/廉价地引用,并且不需要对元组值进行索引。
我已经有过几次这个问题,并且已经通过多种不同的方式解决了这个问题。
方法1:
将元组值转换为字符串,并将它们与某些分隔符连接在一起。
def PutEntity(entity, tuples):
entity.tuples = ['_'.join(tuple) for tuple in tuples]
entity.put()
优点:在数据存储区查看器中可以轻松读取结果,一次性获取所有内容。 缺点:潜在的精度损失,反序列化/序列化所需的程序员,以字符串格式存储数据所需的更多字节。
方法2:
将每个元组值存储在一个列表中并压缩/解压缩元组。
def PutEntity(entity, tuples):
entity.keys = [tuple[0] for tuple in tuples]
entity.values = [tuple[1] for tuple in tuples]
entity.put()
优点:不会丢失精确度,令人困惑但仍可以在数据存储区查看器中查看数据,能够强制执行类型,一次性获取所有内容。
缺点:程序员需要压缩/解压缩元组或仔细维护列表中的顺序。
方法3:
在一些庄园json,pickle,协议缓冲区中序列化元组列表,并将其存储在blob或text属性中。
优点:可用于对象和更复杂的对象,可以减少错误与元组值匹配的风险。
缺点: Blob存储访问需要和其他提取?,无法在数据存储查看器中查看数据。
方法4:
将元组存储在另一个实体中并保留一个键列表。
优势:更明显的架构。如果实体是视图,我们不再需要保留元组数据的两个副本 缺点:两次提取需要一个实体和键列表,一个用于元组。
我想知道是否有人知道哪一个表现最好,是否有一种我没想过的方式?
谢谢, 吉姆
答案 0 :(得分:5)
我使用方法3. Blobstore可能需要额外获取,但db.BlobProperty不需要。对于重要的是它从存储中完全按照它放入的对象我使用PickleProperty(可以在tipfy和其他一些实用程序库中找到)。
对于我只需要存储状态的对象,我编写了一个与PickleProperty类似的JsonProperty函数(但显然使用的是SimpleJson)。
对于我来说,在一次获取中获取所有数据,并且防止白痴,比cpu性能(在App Engine中)更重要。根据AppStats上的Google I / O谈话,数据存储区的访问几乎总是比一些本地解析更昂贵。