2

Google App Engine Python 2.7 クエリ クラスの使用 -

django テンプレートに渡す結果のリストを作成する必要があります。これを行うために私が見つけた2つの方法があります。

  1. フェッチを使用しますが、ドキュメントでは、フェッチはほとんど使用しないでください。https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_fetch

  2. run() を使用し、それを list() にラップして、リスト オブジェクトを作成します。

メモリ使用量の点で、どちらが望ましいですか? これを行う別の方法はありますか?

4

1 に答える 1

2

ここで重要なのは、なぜ fetch「ほとんど使用されるべきではない」かということです。ドキュメントには、fetchすべての結果が取得されると記載されているため、それらすべてを同時にメモリに保持する必要があります。取得するデータが大きい場合は、大量のメモリが必要になります。

runあなたは中に包むことができると言いますlist。確かにそれはできますが、まったく同じ問題に直面することになります — <code>list はすべての要素を強制的にメモリに格納します。したがって、このソリューションは、 を使用するのと同じ理由で、実際には推奨されませんfetch

さて、あなたは言うことができます:それで、私は何をすべきですか?答えは次のとおりです。ほとんどの場合、データの要素を 1 つずつ処理でき、すべての要素を同時にメモリに保持する必要はありません。たとえば、必要なのは結果データを django テンプレートに入れることだけであり、それがテンプレートで最大 1 回しか使用されないことがわかっている場合、django テンプレートは喜んで任意のイテレータを受け取るので、run呼び出し結果を渡すことができます。にラップせずに直接list

同様に、何らかの処理を行う必要がある場合、たとえば、結果を調べて価格やランキングが最も高い要素を見つけるなど、 の結果を反復処理するだけですrun

fetchしかし、すべての要素をメモリに格納する必要がある場合 (例: django テンプレートがクエリからのデータを数回使用する場合)、またはlist(run(…))実際に意味がある場合があります。結局のところ、これは典型的なトレードオフです。メモリ内のすべてのデータを必要とするアルゴリズムをアプリケーションで適用する必要がある場合は、メモリを使い果たしてその代償を払う必要があります。そのため、イテレータで動作するようにアルゴリズムと使用法を再設計するか、fetchより長い処理時間とより高いメモリ使用量でイテレータを使用して支払うことができます。Google はもちろん、最初のことを行うことをお勧めします。そして、これが「ほとんど使用されるべきではない」というのが実際に意味することです。

于 2013-05-28T23:50:14.780 に答える