按块迭代django查询集,节省内存并允许更快地启动。

django-chunked-iterator的Python项目详细描述


#django分块迭代器提供了一种简单的方法来进行复杂的查询。
不幸的是,另一方面,django对于真正庞大的数据集来说,内存消耗很高。

查询所有对象并为内存中的*所有返回行创建模型实例,即使一次只需要一个对象。
内存也将用于在数据库和python的数据库驱动程序中保存结果行。


``python
``entry.object s.all():
print(e.headline)
````

一种改进方法:
[迭代器](https://docs.djangoproject.com/en/2.1/ref/models/querysets/迭代器)。

`` python
entry.objects.iterator():
print(e.headline)
```

这样,django将动态地构造模型实例
仅用于当前迭代。
取决于您的数据库和设置,
django还可以在一个查询中从数据库获取所有行,
或者它可以使用服务器端游标按块获取行。

在后一种情况下(使用服务器端游标)。
在数据库和python的数据库驱动程序中,只会消耗有限的内存
,但这只适用于某些数据库
,并且不使用连接池(如[pgbouncer](https://pgbouncer.github.io))。
您的代码无法确保使用
节省内存的方法。

##design

此分块迭代器接受queryset并进行串行查询
返回固定数量的行或模型实例。
这允许在数据库、python驱动程序和应用程序层上使用固定内存消耗迭代真正大量的行。
作为副作用,行的第一部分返回得更快,
在某些情况下允许并行开始处理。

只有一个限制:模型应该有一个唯一的字段
,用于排序和分页。
在大多数情况下,这是主键,但也可以使用其他字段。


u迭代器

用于批处理迭代器中的项(entry.objects.all()):
用于e in条目:
print(e.headline)
````


限制返回行数

错误!

``python
for e in iterator(entry.objectobjects.all()[:10000]):
print(e.headline)
assertionerror:一旦获取了一个查询片段,就无法重新排序查询。
````

right:

``python
``python
for e in iterator(ententry.objects.all(),limit=10000):
print(e.headline)
```
`



更改批大小批处理大小越小,返回第一个项越快,
附加查询的开销越大。
最佳值从100到1000。

``python
对于迭代器中的e(entry.objects.all(),批处理大小=150):
打印(e.headline)
```

order_by='-created'):
打印(e.headline)
````


\testing

``bash
$pip install-r./requirements.txt
$。/test_project/manage.py test-v 2——带覆盖率——cover package=django_chunked_迭代器

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java是否可以通过使用AtomicInteger的方法对int进行变异?   java对象化实体重用问题   Android在外部播放器中播放视频url   Intelli j Java fx工件jar不工作   java使用另一个已排序列表对多个列表进行排序?   集合和列表接口的Java组合   检查数组中是否有一条路径,其和在java中是递归求和   java Spring确认在创建JDBC连接时从属性文件中读取不正确的值   BufferedReader在java中的工作原理   spring如何在Java中使用两个不同类的对象和比较字段过滤列表   日期回文查找程序运行不正常(Java)   java替代显示。getWidth()   java如何通过中间层将软件与其他软件集成   java获取名称列表/数组,并计算每个唯一名称的列出次数   Android应用程序调试中的java强制关闭错误   java Junit测试调用Dao类的业务类   java跟踪实例属性的更改   java Glassfish和EAR命名约定