3

ここでインサイダー情報を探しています。

データストアに保存したい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ハッシュがあることがわかっているとします。上記のコードは、それぞれがzlistプロパティのサイズが2kより少し小さい10,000個のエンティティを生成します(私自身の簡単なテストに基づく)。

基本的に、MAX_LENGTHの最適値は何でしょうか。MAX_LENGTHが大きくなると、エンティティのサイズも大きくなります。エンティティごとに1MB(〜40,000 MD5ハッシュ)にプッシュする必要がありますか?100は小さすぎますか?1000の方がいいですか?

4

1 に答える 1

0

できるだけ大きくする必要があります-1Mb。理由はわかりません。こうすることで、コストを最小限に抑えることができます。

OTOH、MD5をblobとして保存するので、blobstoreを調べる必要があるかもしれませ

編集:

@Guidoが暗黙的に指摘しているように、GAEは分散システムであるため、複数の書き込みが並行して発生する可能性があるため、より高速になる可能性があります。

于 2012-09-05T06:35:50.907 に答える