0

私は Google App Engine と Python にかなり慣れていませんが、それを使って実際のサイトを初めてリリースしました。しかし今、他のパスよりも大幅に多くの CPU (および API CPU) 時間を使用している 1 つのパスで問題が発生しています。問題の原因となっている単一のデータストア フェッチに絞り込みました。Carvings.all().fetch(1000)

App Engine ダッシュボードの下では、そのパスへの各リクエストに対してかなり確実に「1040cpu_ms 846api_cpu_ms」が報告されています。これが、私のクライアントがサイト全般で経験した無反応の原因である可能性があるようです.

したがって、このクエリの何がそれほど高価なのかわかりません。関連するデータモデルは次のとおりです。

class Carving(db.Model):
    title = db.StringProperty(required=True)
    reference_number = db.StringProperty()
    main_category = db.StringProperty()
    sub_category = db.StringProperty()
    image = db.ReferenceProperty(CarvingImage)
    description = db.TextProperty()
    price = db.FloatProperty()
    size = db.StringProperty()
    material = db.StringProperty()
    added_at = db.DateTimeProperty(auto_now_add=True)
    modified_at = db.DateTimeProperty(auto_now=True)

このモデルをデータストアからプルするとき、アプリの他の場所でさらにフィルタリングを行いますが、それが問題を引き起こしていない理由だと思います。しかし、このモデルのエンティティの総数は 90 をわずかに超えており、なぜこれがそれほど高価なのか想像できません。

4

4 に答える 4

2
  • Memcache、まだ持っていない場合、特に同じ彫刻が何度もフェッチされる場合。全部で 90 個しかない場合は、それらすべてがすぐにキャッシュに格納され、ゴールデンになるはずです。

  • 彫刻のすべてのプロパティが必要ですか? たとえば、彫刻のリストを表示するだけの場合は、いくつかのプロパティしか持たない CarvingSummary のようなエンティティを個別に作成できます。これは、スキーマが非正規化されたことを意味しますが、場合によってはそれが速度の対価です。

また、これはユーザーが常に最初にヒットするページではないと思いますか? その場合、クラウドが新しいインスタンスを起動している可能性があります。

于 2009-12-12T05:29:20.153 に答える
0

実際に1000個のエンティティが必要ですか?CPU時間は、取得される結果の数に応じてほぼ直線的に増加するため、実際にすべての結果が必要でない場合は、結果のフェッチとデコードに多くの時間を浪費している可能性があります。

于 2009-12-12T15:02:21.623 に答える
0

モデル内の「すべての」要素のクエリではなく、インデックス付きクエリを実行すると、パフォーマンスが向上する場合があります。

また、memcache の使用を検討してください。

于 2009-12-12T05:13:02.643 に答える
0

それらのプロパティの大きさに応じて、オブジェクトへのロードとマーシャリングに時間がかかっているのは、画像 (および/または Text プロパティ) である可能性があります。

一等賞: 他の人が言うように memcache を使用してください。その後、オーバーヘッドは最初のヒットでのみ発生します。

2 等賞: 画像がどのくらいの頻度で変更されているか、何枚あるのかはわかりませんが、画像を静的ファイルとしてアップロードし、HTML でそれらにリンクすることを検討してください。そうすれば、ブラウザからの単なる HTTP GET になります。オーバーヘッドが大幅に削減されます。

于 2009-12-14T05:21:11.050 に答える