按块迭代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 Android Studio从XML中洗牌2D数组列   安卓 rx java obsever pojo模型的变化   java如何在安卓应用程序中以编程方式打开google教室   java如何将充满令牌的对象[]转换为整数数组?   java Minify Maven插件抛出“不支持JavaScript引擎”错误   java如何检查调用应用程序的用户是否具有绑定特权端口的权限?   java无法向firestore发送数据   jpanel Java向ScrollPane中嵌入的面板添加JLabel   将Bash脚本移植到Java   JavaSpring显示错误消息   java如何为这些路径表达式编写正则表达式   java如何通过编程在Android手机上获得时间?   Java:捕获未检查的异常与已检查的异常