1

データを保存するための次のクラスがあります。

class AppList(ndb.Model):
    '''
    Index
      Key:              sender
    '''
    sender = ndb.StringProperty()
    texts = ndb.StringProperty(repeated=True)
    recipients = ndb.StringProperty(repeated=True)
    service_centers = ndb.StringProperty(repeated=True)
    counter = ndb.IntegerProperty(default=0)
    ignore = ndb.BooleanProperty(default=False)

    added = ndb.DateTimeProperty(auto_now_add=True, indexed=False)
    updated = ndb.DateTimeProperty(auto_now=True, indexed=False)

現在、約 4,000 件のレコードが含まれています。

サイクルで次のコードを使用して読み取ろうとすると:

entries = AppList.query()
res, cur, more = entries.fetch_page(100, start_cursor=cur)

で失敗しOverQuotaError(The API call datastore_v3.RunQuery() required more quota than is available.)ます。無料クォータは 0.05 ミリオン Ops です。複数のrepeatedプロパティが原因で発生するようです。ignoreしかし、すべての値を読み取る唯一のタスクは、各レコードのプロパティに False 値を割り当てることです( entry.ignore = False)。

私の場合、読み取りを最適化する方法はありますか?

4

3 に答える 3

1

50,000 は、データストアの課金対象オペレーションの1 日あたりの無料割り当てです。データストアの課金対象オペレーションは、データストア API 呼び出しと同じではないことに注意してください。比較については、この表を参照してください。

したがって、4k のエンティティをクエリすると、8k の課金対象のデータストア オペレーションが発生します。1 日あたりの制限が 50,000 に近い場合、この API 呼び出しは失敗し、エラーが表示されます。

于 2013-11-11T11:08:15.607 に答える
1

すべてのエンティティを取得して更新しているため、appstats はあまり役に立ちません。

エンティティを更新しようとしているため、射影クエリは機能しません。クォータを超えたり、課金を有効にしたりしないように、更新を数日かけて少しずつ行います。

多くのプロパティを持つエンティティを書き込むと、インデックスも更新されるため、IOPS が高くなります。インデックスを必要としないプロパティがある場合は、noindex=True を設定して再デプロイすると、IOPS が削減されますが、これがどの程度の影響を与えるかはわかりません。BlobProperty 以外のすべてのプロパティは、既定でインデックスが作成されます。

于 2013-11-11T10:51:36.640 に答える