在App-Engine中存储元组列表的最佳性能是什么?

Jim*_*imr 10 python google-app-engine google-cloud-datastore

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

当我遇到这个问题时,元组可以是从键值对到日期时间和样本结果到(x,y)坐标的任何东西.
元组的数量是可变的,范围从1到几百.

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

我曾经有过几次这个问题,并且已经通过多种方式解决了这个问题.

方法1:

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

def PutEntity(entity, tuples):
  entity.tuples = ['_'.join(tuple) for tuple in tuples]
  entity.put()
Run Code Online (Sandbox Code Playgroud)

优点:在数据存储区查看器中可以轻松读取结果,一次性获取所有内容. 缺点:潜在的精度损失,反序列化/序列化所需的程序员,以字符串格式存储数据所需的更多字节.

方法2:

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

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

优点:不会损失精度,令人困惑但仍然可以在数据存储区查看器中查看数据,能够强制执行类型,一切都可以获取.
缺点:程序员需要压缩/解压缩元组或仔细维护列表中的顺序.

方法3:

在一些庄园json,pickle,协议缓冲区中序列化元组列表,并将其存储在blob或text属性中.

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

方法4:

将元组存储在另一个实体中并保留密钥列表.

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

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

谢谢,吉姆

Cal*_*vin 5

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

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

对于我来说,在一次获取中获取所有数据并且是防止白痴,比cpu性能(在App Engine中)更重要.根据AppStats上的Google I/O谈话,数据存储区的访问几乎总是比一些本地解析更昂贵.