dask能处理单机内存装不下的数据集,因其采用延迟计算与分块加载机制:dd.read_csv()仅构建任务图、按需加载分区,内存中只驻留活跃块和元数据,而非全量数据。

Dask 能处理单机内存装不下的数据集,不是因为它“更聪明”,而是它根本不试图把全部数据塞进内存——Pandas 会,所以必崩。
dd.read_csv() 不加载数据,只建任务图
Pandas 的 pd.read_csv() 一执行就往内存里灌全量数据,哪怕你只想要第一行;Dask 的 dd.read_csv() 只扫描文件头、估算行数、按字节范围切分块(默认每块 25–100MB),生成一个延迟任务图,真正读取发生在 .compute() 那一刻,且每次只载入一个块。
- 文件超大时,
dd.read_csv()几乎瞬时返回,pd.read_csv()卡死或报MemoryError - 分块大小可通过
blocksize参数调整,太小增加调度开销,太大可能单块仍爆内存 - 如果 CSV 含不规则换行或引号嵌套,Dask 可能误切;此时需先用
pd.read_csv(..., nrows=1000)探查结构,再传给dd.read_csv(..., sample=False, dtype=...)
groupby().apply() 在 Dask 里必须可序列化
你在 Pandas 里随手写的 lambda 或闭包,在 Dask 里大概率直接报 PicklingError 或 AttributeError,因为每个分区要在独立进程里重放逻辑。
- 必须用
def显式定义函数,所有依赖显式传参,不能引用外部变量或模块状态 - 避免在
.apply()里构造pd.DataFrame;若真需要,先用dd.from_pandas(..., npartitions=)把样本转成 Dask DataFrame 再测试 - 复杂逻辑别硬扛:用
ddf.partitions[0].compute()抽样跑通 Pandas 版本,确认逻辑无误再全量.compute()
.compute() 后内存没降?是你没放手
ddf.groupby('x').sum().compute() 返回的是标准 pd.DataFrame,但原始 ddf 对象还在内存里,带着完整的任务图、元数据、临时缓存路径(比如 /tmp/dask-*)。
- 执行完立刻
del ddf,尤其在循环处理多个大文件时 - 若用了
dd.persist(),记得配套调用client.cancel()(分布式)或手动清理dd.utils.clear_memory() - Excel 场景下,Dask 默认解压 XML 到
/tmp并缓存,不手动rm -rf /tmp/dask-*,磁盘会悄悄吃满
真正容易被忽略的,是“计算完成”不等于“资源释放”——Dask 不替你做垃圾回收,它只管把活干完。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











