0

現在、多くの人に利用されるはずのプロジェクトに取り組んでいます。データストアの読み取り/書き込み/小さな操作が大量のリソースを使用しているのではないかと心配しています。私はappengineを初めて使用するので、これらの数値を小さくする効率的な方法はありますか?memcacheを使用することを考えましたが、これは最も安全な方法ではありません。また、以下を使用してデータストアエンティティを検索することをお勧めします。

SELECT __key__ FROM table

次に使用します:

....#code
table.get_by_id(entity.id())
....#code

どうもありがとうございます。

4

4 に答える 4

8

頻繁に読み取られ、それほど頻繁に書き込まれないデータの場合は、データストアの前にあるmemcacheを使用します。読み取るときは、最初にデータがmemcacheにあるかどうかを確認し、ない場合はデータストアから読み取ってから、将来の読み取りのためにmemcacheに保存します。キーごとにエンティティを読み取るという単純なケースでは、各エンティティをそのデータストアキーごとにmemcacheに保存できます。クエリの場合、クエリパラメータでキー設定された結果セットをmemcacheに保存する価値があるかどうかを判断する必要があります。

書き込むときに、memcache値を削除すると、次回の読み取り時に再読み込みされます。削除が失敗する可能性を持って生きる必要があります。通常、memcache値に有効期限を設定して、古い値があまり長く続かないようにします。1秒あたりの読み取り数が多い場合でも、有効期限が短い場合でもパフォーマンスが大幅に向上することに注意してください。

また、URLフェッチや計算値(複雑なテンプレートテキストなど)など、他の時間のかかるデータ操作と同じようにmemcacheを使用することもできます。これらすべての場合で、memcache値が削除されていると、プライマリソースにフォールバックするため、データへのアクセスを失うことなく読み取りパフォーマンスを向上させることができます。

その他のパフォーマンスのヒント:RPCの数を減らすために、可能な場合はバッチ呼び出しを使用してください。可能な場合は非同期呼び出しを使用して、アプリが他のことをしている可能性があるときにサービス呼び出しをブロックしないようにします。AppStatsを使用して、サービスコールを視覚化し、非同期コールが役立つ可能性のある領域を見つけます。

キーごとのフェッチに関する質問について:一般に、キーのみのクエリを実行してからすぐに結果エンティティをキーでフェッチしても、それはすべてフルエンティティクエリで行われるため、役に立ちません。ただし、クエリの結果から選択的にフェッチする必要がある場合、またはある場所でキーをクエリして別の場所でフェッチすることが理にかなっている場合は、それらが可能であり、多くを失うことはありません。キーのみのクエリの用途がよくあります。(インデックス付きの)プロパティのサブセットのみをフェッチする方法については、プロジェクションクエリも参照してください。

于 2012-06-05T17:22:05.697 に答える
8

Pythonを使用しているように見えるので、新しいデータストアAPIであるNDBを使用することを強くお勧めします。

NDBは、memcacheを自動的に使用して、モデルをバックグラウンドでキャッシュします。追加の作業は必要ありません。memcacheを手動で使用することも検討する必要がありますが、ndbは特効薬ではありません。しかし、それは無料であなたを助けます、それはいつも素晴らしいです。

パフォーマンスの向上を超えて、アプリエンジンデータストアへのよりクリーンなインターフェースです。また、バルク操作をクリーンにサポートしているため、パフォーマンスが向上する可能性があります。

于 2012-06-05T18:20:13.510 に答える
2

Google App Engineでデータストアを使用する最も効率的な方法は...データストアを使用しないことです!遅いです。

可能な限りmemcacheを使用してください。memcacheの「安全でない」とは何ですか?それは確かに珍しい批評です。

また、エンティティのキ​​ーまたはIDがわかっている場合は、get_by_key_nameなどを使用して直接ロードします。

于 2012-06-05T17:02:34.897 に答える
1

いいえ、返されたキーで識別されるエンティティの一部のみを取得する場合を除いて、キーのみのクエリを実行してからエンティティを個別にフェッチする理由はありません。これがより効率的であれば、データストアが自動的に行います。通常のクエリを実行するだけです。

于 2012-06-07T03:13:22.367 に答える