3

速度に関してこれを改善する方法について、アドバイスを求めています。

私のデータモデル:

class Events(ndb.Model):
    eventid = ndb.StringProperty(required=True)
    participants = ndb.StringProperty(repeated=True)

私がデータを取得しようとする方法:

def GetEventDataNotCached(eventslist):
    futures = []
    for eventid in eventslist:
        if eventid is not None:
            ke = database.Events.query(database.Events.eventid == eventid)
            future = ke.get_async(keys_only = True)
            futures.append(future)

    eventskeys = []
    for future in futures:
        eventkey = future.get_result()  
        eventskeys.append(eventkey)

    data = ndb.get_multi(eventskeys)

したがって、キーを非同期に取得し、キーを「get_multi」に渡すよりも、パフォーマンスにまだ満足していないため、それを高速化する他の方法はありますか。

繰り返しプロパティには、最大で数百の文字列を含めることができます。Events モデルには 10.000 行がいくつかあります。eventslist には、取得したい数十のイベント ID があります。

4

2 に答える 2

5

repeated=True長いリスト (つまり、大きなプロパティ)のプロトコル バッファからの逆シリアル化のオーバーヘッドが非常に小さいことがわかりました。

appstatsでこれを見ましたか?の後に RPC が実行されていない空白の大きなギャップが見られますget_multi()か? それが逆シリアル化のオーバーヘッドです。

これを克服するために私が見つけた唯一の方法は、長いリストを削除して別のモデルで管理することです (つまり、長く繰り返されるプロパティ リストを完全に避けることです)。

したがって、大きな問題は、イベントのリストを取得するときにすべての参加者が本当に必要なのか、それとも何らかの方法でその検索を延期できるのかということです。たとえば、すべてのイベントを同期的にフェッチしてから、(異なるモデルから) 各イベントの参加者の非同期フェッチを開始し、メモリ内で結合する方が安価/高速である可能性があります。したがって、サブクエリのコストを制限できますか?

于 2013-02-15T17:37:44.953 に答える
2

シンプルさと実行速度の改善ですが、コストは改善されません。

data = database.Events.query(database.Events.eventid.IN(eventslist)).fetch(100)

次のステップは、次のように作成された、キーの id として eventid を持つことです。

event = Event(id=eventid, ...)

その場合、あなたはそうします

data = ndb. get_multi(ndb.Key(Event, eventid) for eventid in eventlist)

どちらが高速で、len(eventlist)*6 倍安くなります。

于 2013-02-14T00:02:23.160 に答える