Dask: Sorting truly lazily(达斯克:真正懒惰地分类)
本文介绍了达斯克:真正懒惰地分类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如果我有一个具有未知分区的数据集,并且希望根据列对其进行排序并将其输出到Parquet,则在我看来,Dask至少会执行两次部分工作:
import dask
import dask.dataframe as dd
def my_identity(x):
"""Does nothing, but shows up on the Dask dashboard"""
return x
df = dask.datasets.timeseries()
df = df.map_partitions(my_identity)
df = df.set_index(['name']) # <- `my_identity` is calculated here, as well as other tasks
df.to_parquet('temp.parq') # <- previous tasks seem to be recalculated here
如果my_identity需要计算,则重新计算将非常昂贵。
我的理解是不是Dask会在这里做两次工作?有什么方法可以防止这种情况发生吗?
推荐答案
下面的解释可能不准确,但希望能有所帮助。
让我们试试看达斯克在这件事上的处境。我们正在要求Dask.创建一个基于某些变量的索引...Dask只适用于已排序的索引,因此Dask会想知道如何重新排列数据以使其排序,以及分区的适当划分。您看到的第一个计算就是这样做的,DASK将只存储划分/数据重新洗牌所需的计算部分。
然后,当我们要求DASK保存数据时,它会计算变量,将数据置乱(与之前的计算一致),并将其存储在相应的分区中。
如何避免这种情况?可能的选项:
persist设置索引之前。一旦持久化,Dask会计算变量并将其保留在工作进程上,因此设置索引将引用该计算的结果。仍将对所需的数据进行重新洗牌)。请注意,文档建议持久化after设置索引,但这种情况假设列存在(不需要单独计算)。在分区内排序,这可以很慢地完成,但当然只有在不需要全局排序的情况下才是一个选项。
使用纯文本
pandas,这可能需要对数据进行一些手动分块(我倾向于使用排序)。
这篇关于达斯克:真正懒惰地分类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
编程基础网
本文标题为:达斯克:真正懒惰地分类
基础教程推荐
猜你喜欢
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 尝试制作WhatsApp机器人 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
