Python 应用程序引擎中实体的最佳大小是多少

Python 应用程序引擎中实体的最佳大小是多少,python,google-app-engine,app-engine-ndb,Python,Google App Engine,App Engine Ndb,在这里寻找内幕信息 我有一个要存储在数据存储中的MD5哈希的大列表。列表足够大,我必须使用多个实体来存储它。这意味着我必须将我的列表分解成更小的列表,并分别存储它们 为此,我有一个简单的模型,可以存储和检索任意长的哈希列表: class HashList(nbd.Model): MAX_LENGTH = 100 zlist = ndb.BlobProperty() keyword = ndb.StringProperty() index = ndb.IntegerPropert

在这里寻找内幕信息

我有一个要存储在数据存储中的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)))
假设我知道这个列表有1000000个MD5散列。上面的代码将生成10000个实体,每个实体的zlist属性的大小略小于2k(基于我自己的简单测试)


基本上,我想知道最大长度的最佳值是什么。如果最大长度变大,则实体大小变大。我是否应该将每个实体的内存提高到1MB(~40000 MD5哈希)?100太小了吗?1000更好吗?

您应该尽可能大-1Mb。我看没有理由不这样做:这样可以使成本最小化

OTOH,既然您将MD5存储为blob,也许您应该研究一下

编辑:


正如@Guido暗示的那样,GAE是一个分布式系统,因此多个写操作可以并行进行,因此可能会更快

我在某个地方读到,AE针对较小的实体进行了优化。我希望我能找到链接。但这正是我提出这个问题的原因。所以,我担心存储很多1MB的实体会降低性能。因为您保存的是相同数量的未索引数据,我看不出一个大实体比多个小实体慢的方式。您真的必须对其进行测量。嗯,再想想,GAE对多个服务器并行执行此操作,因此速度更快。@Guido:从关于索引构建的文章判断,对put()的调用在实体实际完全写入DB之前返回(索引仍在构建)。在这种情况下,异步put会使并行put更快吗?还是说多放够了?