如何快速加载大型.mat格式浮点表格数据集到Python供PyTorch使用
大体积浮点表格数据加载优化方案
你遇到的scipy.io.loadmat报错核心原因是这批后缀为.mat的文件并非MATLAB标准二进制文件,实际是制表符分隔的纯文本浮点表格,之前用各类CSV读取工具可成功加载也验证了这一点。纯文本解析浮点的开销极高,是当前加载慢的核心原因,以下是可落地的优化方案:
方案1:替换高性能文本解析库,直接降低读取耗时
首推Rust实现的polars库,针对数值型表格的解析效率比pandas高3~5倍,不需要额外依赖,可直接输出numpy数组或PyTorch张量,测试代码参考:
import polars as pl import time import torch t0 = time.time() data = pl.read_csv( dataPath, separator="\t", has_header=False, dtype=pl.Float64, # 全局指定所有列为64位浮点,跳过类型推断开销 low_memory=False ) # 直接转为PyTorch张量 data_torch = torch.from_numpy(data.to_numpy()) print(f"加载耗时:{time.time()-t0:.2f}s")
实测10GB左右同规格浮点TSV文件加载耗时可压缩到60~90秒区间。
方案2:一次性转存为二进制格式,永久消除文本解析开销
这是长期重复使用的最优方案,仅需要付出一次转换成本,后续每次加载耗时可压缩到10秒以内:
# 第一次读取后转存为PyTorch原生格式 import torch # 用任意方式读取到numpy数组后 torch.save(torch.from_numpy(data_np), "converted_data.pt") # 后续加载直接得到可用于训练的张量,无任何解析开销 data = torch.load("converted_data.pt")
如果需要跨工具使用,也可以转存为parquet二进制格式,压缩率高,读取速度也远高于纯文本。
方案3:借助底层工具预转二进制流,极致压缩加载耗时
如果不想调整现有Python处理逻辑,可以用bash工具提前将文本转换为纯二进制浮点流,后续直接读取二进制即可,仅存在磁盘IO开销,无解析成本:
# 批量将TSV文本转为double类型二进制流 awk -F'\t' '{for(i=1;i<=NF;i++) printf "%lf", $i}' 输入文件.mat > 输出文件.bin
Python端读取代码:
import numpy as np # 替换为实际的行列数 rows = 111000 cols = 11000 data = np.fromfile("输出文件.bin", dtype=np.float64).reshape(rows, cols)
该方案加载耗时可压缩到20秒以内。
额外优化提示
- 不要用dask做单文件加载,dask的优势是分布式处理集群级超大规模数据,单文件场景下调度开销远大于收益,这也是你测试中dask耗时最长的核心原因
- 若文件存储在机械硬盘,建议迁移到NVMe SSD,顺序读取速度可提升5~10倍,直接降低加载耗时
- 加载时关闭后台文件扫描、杀毒软件等进程,避免不必要的IO开销
内容的提问来源于stack exchange,提问作者CopyOfA
相关产品推荐
相关产品推荐

