什么是App Engine中的实体的最佳大小

时间:2012-09-05 06:27:39

标签: python google-app-engine app-engine-ndb

在此处寻找内幕消息。

我有一个很大的MD5哈希列表,我希望将其存储在数据存储区中。该列表足够大,我必须使用多个实体来存储它。这意味着我必须将我的列表分解为较小的列表并单独存储它们。

要做到这一点,我有一个简单的模型,可以存储和检索任意长的哈希列表:

class HashList(nbd.Model):
  MAX_LENGTH = 100

  zlist = ndb.BlobProperty()
  keyword = ndb.StringProperty()
  index = ndb.IntegerProperty()

  @classproperty
  def StoreList(cls, keyword, long_list):
    entities = []
    index = 0
    for i in range(0, len(long_list), cls.MAX_LENGTH):
      zlist = zlib.compress('\n'.join(long_list[i:i+cls.MAX_LENGTH]))
      entities.append(cls(keyword=keyword, index=index, zlist=zlist))
      index += 1
    ndb.put_multi(entities)

  @classproperty
  def GetList(cls, keyword):
    unpack = lambda e: zlib.decompress(e.zlist).split()
    q = cls.query(cls.keyword == keyword).order(cls.index)
    return list(itertools.chain(*q.map(unpack)))

假设我知道该列表有1,000,000个MD5哈希值。上面的代码将生成10,000个实体,每个实体的zlist属性大小略小于2k(基于我自己的简单测试)。

基本上,我想知道MAX_LENGTH的最佳值是什么。如果MAX_LENGTH变大,则实体大小变大。我应该向每个实体推送1MB(约40,000个MD5哈希值)吗? 100太小了吗? 1000更好吗?

1 个答案:

答案 0 :(得分:0)

你应该尽可能大 - 1Mb。我没有理由不这样做:这样可以最大限度地降低成本。

OTOH,因为你将MD5存储为blob,也许你应该研究blobstore

修改

正如@Guido暗示的那样,GAE是一个分布式系统,因此多个写入可以并行发生,因此可能更快。