2

使用 Google App Engine Python 2.7 查询类 -

我需要生成一个传递给我的 django 模板的结果列表。我发现有两种方法可以做到这一点。

  1. 使用 fetch,但是在文档中它说几乎不应该使用 fetch。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.

现在,你可以说:那我该怎么办?答案是:在大多数情况下,您可以一个一个地处理数据元素,而无需同时将它们全部保存在内存中。例如,如果您只需将结果数据放入 django 模板中,并且您知道它在模板中最多会使用一次,那么 django 模板将很乐意接受任何迭代器——因此您可以传递run调用结果直接不包装成list.

同样,如果您需要进行一些处理,例如查看结果以找到价格或排名最高的元素,或者其他任何内容,您可以迭代run.

但是,如果您的使用需要将所有元素都保存在内存中(例如:您的 django 模板多次使用查询中的数据),那么您有一个案例fetchlist(run(…))实际上是有意义的。最后——这只是典型的权衡:如果您的应用程序需要应用一种算法,该算法需要内存中的所有数据,您需要通过耗尽内存来为此付出代价。因此,您可以重新设计您的算法和使用以使用迭代器,或者fetch通过更长的处理时间和更高的内存使用来使用它并为此付费。谷歌当然鼓励你做第一件事。这就是“几乎不应该使用”的实际含义。

于 2013-05-28T23:50:14.780 回答