gpt4 book ai didi

python - fetch() 是否优于 list(Model.all().run()) 从数据存储区查询返回列表?

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:52 25 4
gpt4 key购买 nike

使用 Google App Engine Python 2.7 查询类 -

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

  1. 使用 fetch,但是在文档中说几乎不应该使用 fetch。 https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_fetch

  2. 使用 run() 然后将其包装到 list() 中,从而创建列表对象。

就内存使用而言,一个比另一个更可取吗?有没有其他方法可以做到这一点?

最佳答案

这里的关键是为什么 fetch “几乎不应该被使用”。文档说 fetch 将获得所有结果,因此必须同时将所有结果保存在内存中。如果您获得的数据很大,您将需要大量内存。

你说你可以将 run 包装在 list 中。当然,您可以这样做,但您会遇到完全相同的问题 — list 会将所有元素强制放入内存中。因此,与使用 fetch 一样,实际上不鼓励使用此解决方案。

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

类似地,如果您需要做一些处理,例如遍历结果以找到价格或排名最高的元素,或者其他什么,您可以迭代 run 的结果。

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

关于python - fetch() 是否优于 list(Model.all().run()) 从数据存储区查询返回列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16803262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com