机器学习数据加载方案选择:循环内外加载哪种更优?
方案选择分析:10万+数据集的循环处理场景
对于你的场景,方案一更合理,核心原因是磁盘IO的开销远大于内存占用的影响,具体分析如下:
方案一的核心优势
- 极低的IO开销:CSV文件的磁盘读取是典型的耗时操作,方案一只加载一次数据,避免了方案二循环10次就重复读取10次文件的巨大浪费,循环运行速度会快很多。
- 预处理仅执行一次:删除无关列这类预处理操作只需做一次,不用在每次循环里重复执行,进一步节省计算资源。
- 逻辑更清晰:数据加载、预处理与业务逻辑(ML建模、可视化)分离,代码可读性和可维护性更强。
方案一的唯一劣势是全程占用全量数据的内存,但10万+数据点的CSV文件,哪怕包含数十列,内存占用通常也在几百MB级别,现代普通机器(8GB+内存)完全可以轻松承受,不会造成内存压力。
方案二的核心问题
- 重复IO浪费严重:每次循环都重新读取完整CSV,磁盘IO的耗时会让整个流程的运行效率大幅下降,10次循环的总耗时可能是方案一的数倍甚至十几倍。
- 内存优势并不真实:方案二每次加载数据时,内存依然会先容纳完整的数据集,只是筛选子集后旧数据会被垃圾回收,实际内存峰值和方案一并无差异,只是平均内存占用略低,但这一点优势完全无法抵消IO开销的劣势。
优化建议(基于方案一)
你可以进一步优化方案一的效率:
- 补全预处理操作:将
data.drop(['column2', 'column3'])改为data = data.drop(['column2', 'column3']),确保预处理生效。 - 提前按分组准备数据:用
grouped = data.groupby('column1')提前按column1分组,循环时直接取出对应分组的子集,不用每次重新执行筛选:
data = pd.read_csv("sample.csv") data = data.drop(['column2', 'column3']) # 补全赋值操作 grouped = data.groupby('column1') for i in range(0,10): if i in grouped.groups: subset = grouped.get_group(i) # 执行ML建模和可视化操作
- 若确实遇到内存瓶颈(比如数据集远大于10万行),可以考虑用
pd.read_csv的chunksize参数分批加载并预处理,但对于10万级别的数据,这个操作并非必要。
内容的提问来源于stack exchange,提问作者Sathvika Seshasayee
相关产品推荐
相关产品推荐

