Win10 16G内存下Dask读取.part拆分CSV文件卡顿显示异常如何解决
问题场景
- 建模需处理总大小约50GB的CSV数据集,设备为16GB内存的Windows 10电脑,无法直接全量加载数据到内存
- 采用Dask读取原始文件并拆分为多个小分片,拆分流程运行正常,生成
.part后缀的分片文件 - 读取拆分后文件时所有单元格仅显示
...,执行读取代码时进程长期挂起无响应,即使拉取极少量数据也无法正常返回
复现问题的代码:
!pip install dask import dask.dataframe as dd cat = dd.read_csv(paths.data + "cat.csv/*") cat.head(5)
排查修复方案
按优先级逐个操作即可解决:
- 修正文件匹配规则
现有代码用*匹配目录下所有内容,会把拆分时生成的元数据文件、校验文件、系统隐藏文件等非CSV文件也纳入读取队列,Dask解析非结构化文件时会直接挂死。将匹配规则改为仅读取实际的.part分片文件:cat = dd.read_csv(paths.data + "cat.csv/*.part") - 显式指定字段类型,关闭默认类型推断
Dask默认会扫描多片分片做全量字段类型推断,Windows下文件IO效率偏低,一旦不同分片的同字段类型存在差异,类型推断流程会无限挂起,同时会因类型匹配失败导致单元格显示...。读取前先通过小样本拿到字段类型映射,读取时直接传入,跳过推断流程:import pandas as pd # 读取第一个分片的前1000行做样本,生成类型映射 sample = pd.read_csv(paths.data + "cat.csv/0.part", nrows=1000) dtype_map = sample.dtypes.astype(str).to_dict() # 把所有object类型统一指定为str,避免类型冲突 dtype_map = {k: str if v == "object" else v for k, v in dtype_map.items()} cat = dd.read_csv( paths.data + "cat.csv/*.part", dtype=dtype_map, assume_missing=True, low_memory=False ) - 调整Dask本地运行配置
Windows环境下Dask默认的并行参数会分配过多worker,直接占满16GB内存导致进程假死。读取数据前手动初始化本地集群,预留足够内存给系统:from dask.distributed import Client, LocalCluster # 按自身CPU核心数调整n_workers,总内存分配不要超过物理内存的75% cluster = LocalCluster(n_workers=4, memory_limit="12GB") client = Client(cluster) - 修复显示省略号问题
单元格全显示...是pandas默认的内容截断配置导致的,执行数据读取前先修改显示参数:pd.set_option('display.max_columns', None) pd.set_option('display.max_rows', None) pd.set_option('display.max_colwidth', None) - 调整head()读取逻辑
head()默认仅从第一个分片拉取数据,如果第一个分片写入不完整、存在损坏,会导致读取永久挂起。可以指定拉取多个分片的头部数据,跳过异常分片:cat.head(5, npartitions=3, compute=True)
注意:如果分片是通过Dask的
to_csv()方法生成的,不要手动修改分片文件名,也不要往分片目录下存放其他无关文件,否则会破坏Dask的分片索引结构导致读取失败。
内容的提问来源于stack exchange,提问作者Zulee
相关产品推荐
相关产品推荐

