ここでインサイダー情報を探しています。
データストアに保存したい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の方がいいですか?