为何Dask读取文件后删除源文件报FileNotFound错误,而Pandas不会?
问题根因
- Dask的核心设计是懒执行:调用
dd.read_csv()时仅生成逻辑执行图,不会实际将文件数据加载到内存,只有触发compute()/persist()/数据导出等实际计算操作时,才会去读取源文件内容。 - Pandas是立即执行:调用
pd.read_csv()时就会把全量数据加载到内存,后续操作和源文件没有关联,所以删除源文件不会报错。
解决方案(针对小数据集场景)
方案1:直接转为Pandas DataFrame
如果你的数据集完全可以放入单机内存,不需要用到Dask的分布式计算能力,直接将Dask DataFrame转换为Pandas DataFrame即可:
import dask.dataframe as dd # 读取csv生成Dask DataFrame ddf = dd.read_csv("data_iris.csv") # 触发全量数据加载,转为Pandas DataFrame df = ddf.compute() # 此时可以安全删除源文件,后续操作df完全不依赖源文件
方案2:保留Dask DataFrame结构,将数据持久化到内存
如果你需要继续使用Dask的接口做后续计算,可以调用persist()方法将全量数据加载到内存中,后续操作不会再访问源文件:
import dask.dataframe as dd # 读取csv后直接持久化到内存 ddf = dd.read_csv("data_iris.csv").persist() # 此时可以安全删除源文件,所有对ddf的后续操作直接读取内存数据
注意:两种方案都需要确保你的可用内存大小足以容纳全量数据集,小数据集场景下完全适用。如果是超过内存的大数据集,建议先将数据转存为Parquet等更高效的持久化格式后再删除源csv文件。
内容的提问来源于stack exchange,提问作者3Mcollab
相关产品推荐
相关产品推荐

