ここで重要なのは、なぜ fetch
「ほとんど使用されるべきではない」かということです。ドキュメントには、fetch
すべての結果が取得されると記載されているため、それらすべてを同時にメモリに保持する必要があります。取得するデータが大きい場合は、大量のメモリが必要になります。
run
あなたは中に包むことができると言いますlist
。確かにそれはできますが、まったく同じ問題に直面することになります — <code>list はすべての要素を強制的にメモリに格納します。したがって、このソリューションは、 を使用するのと同じ理由で、実際には推奨されませんfetch
。
さて、あなたは言うことができます:それで、私は何をすべきですか?答えは次のとおりです。ほとんどの場合、データの要素を 1 つずつ処理でき、すべての要素を同時にメモリに保持する必要はありません。たとえば、必要なのは結果データを django テンプレートに入れることだけであり、それがテンプレートで最大 1 回しか使用されないことがわかっている場合、django テンプレートは喜んで任意のイテレータを受け取るので、run
呼び出し結果を渡すことができます。にラップせずに直接list
。
同様に、何らかの処理を行う必要がある場合、たとえば、結果を調べて価格やランキングが最も高い要素を見つけるなど、 の結果を反復処理するだけですrun
。
fetch
しかし、すべての要素をメモリに格納する必要がある場合 (例: django テンプレートがクエリからのデータを数回使用する場合)、またはlist(run(…))
実際に意味がある場合があります。結局のところ、これは典型的なトレードオフです。メモリ内のすべてのデータを必要とするアルゴリズムをアプリケーションで適用する必要がある場合は、メモリを使い果たしてその代償を払う必要があります。そのため、イテレータで動作するようにアルゴリズムと使用法を再設計するか、fetch
より長い処理時間とより高いメモリ使用量でイテレータを使用して支払うことができます。Google はもちろん、最初のことを行うことをお勧めします。そして、これが「ほとんど使用されるべきではない」というのが実際に意味することです。