使用Dask替代Pandas加速文件读取时遇无限运行问题
解决Dask read_fwf任务无限期挂起的问题
问题原因
你设置的blocksize=640刚好落在行中间——生成的每行是300个字符(300字节),640字节对应2整行加60字节,也就是每个块会从某一行的中间开始解析。Dask的read_fwf需要找到完整的行边界才能正确解析固定宽度格式,这种跨行的块会让它一直等待完整行,导致任务无限期无法完成。
另外,你的代码只定义了Dask DataFrame对象,没有触发实际计算(比如调用.compute()),但这不是任务挂起的核心原因,核心是blocksize的不合理设置。
修复方案
去掉手动设置的blocksize:让Dask自动选择合适的块大小,它会默认按行边界分割文件:
import dask.dataframe as dd with open("tmp_gdo.txt", "w") as f: f.writelines(["A"*300 for _ in range(10_000_000)]) df = dd.read_fwf( "tmp_gdo.txt", colspecs=[(i*10, i*10+10) for i in range(30)], # 移除blocksize参数 ).compute() # 触发计算如果必须手动设置blocksize:确保它是每行长度的整数倍(这里每行300字节),比如设为
300*200=60000,保证每个块都是完整的行集合:df = dd.read_fwf( "tmp_gdo.txt", colspecs=[(i*10, i*10+10) for i in range(30)], blocksize=60000, # 300字节/行 * 200行 = 60000字节 ).compute()
额外说明
固定宽度格式的文件解析对行边界很敏感,Dask在分块时必须保证每个块的起始和结束都是完整的行。过小或不匹配行长度的blocksize会导致解析逻辑陷入死循环,无法完成任务。
内容的提问来源于stack exchange,提问作者Raphael
相关产品推荐
相关产品推荐

