【问题标题】:What is The Optimal Size for An Entity In App Engine [closed]App Engine 中实体的最佳大小是多少 [关闭]
【发布时间】:2012-09-05 06:27:39
【问题描述】:

在这里寻找内幕信息。

我有一个大的 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 更好吗?

【问题讨论】:

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


    【解决方案1】:

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

    OTOH,由于您将 MD5 存储为 blob,也许您应该查看blobstore

    编辑:

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

    【讨论】:

    • 我在某个地方读到过,AE 针对较小的实体进行了优化。我希望我能找到链接。但这就是我提出问题的原因。所以,我担心存储许多 1MB 的实体会降低性能。
    • 由于您要保存相同数量的未编入索引的数据,我不认为一个大型实体会比多个较小尺寸的实体慢。
    • 你真的必须衡量它。
    • 嗯,再想一想,GAE 会在多台服务器上并行执行此操作,因此这可能会更快。
    • @Guido:从关于索引构建的文章来看,在实体实际完全写入数据库之前调用 put() 返回(索引仍在构建中)。在这种情况下 async put 会使这个并行 put 更快吗?还是多放就够了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2012-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多