欢迎光临散文网 会员登陆 & 注册

【干货】将33G数据集转为3G,这个案例值得学习

2023-03-16 09:24 作者:啥都会一点的研究生  | 我要投稿

几年前在StackOverflow上看到的一个问题,现在找不到了,当时记录了一点在草稿箱中

是个很好的学习案例,对于需要注意的地方也会进行提示

当加载数据集变大时,我们的系统可能会卡顿崩掉,这个案例是将33G数据压缩到了3.7G

依赖库

pandas是常用的数据分析库之一,用于数据处理等

垃圾收集器 (GC) ,在处理大量数据时从内存中释放空间,从内存中删除不需要的东西

glob 库使用系统中的模式提取特定文件

os 库与操作系统交互并处理文件及其路径

分块(chunk)

这里不能像处理小规模数据那样直接加载数据文件,会导致崩溃

可以使用“chunksize”拆分文件,此处为每个块选择50万行,可根据每个人任务&机器性能来定

这里‘gc.collect()’的使用非常巧妙且至关重要,可以避免内存错误

运行后得到若干个chunk

然后查看是否可以读取chunk并检查信息

从打印输出可以看出,190列中有185列是float64类型,这也是pandas 总是将 float 数据加载为 float64 的常见问题之一

通过优化该部分,可以减少数据集中的一部分内存

所以将其转换为‘float16’或‘float32’以最小化内存使用,这里将其转换为“float16”

敲黑板了,请搞清楚你数据集这样转换是否会丢失数据精度!!!

可以看到转换为“float16”后,内存使用量大大减少

优化和拼接chunk文件

之前读取并优化了单个chunk文件,现在将拼接所有 23 个chunk文件并优化内存

使用‘glob’和‘os’ 方法访问到相应的文件,即(“*.csv”)

然后通过迭代读取所有文件,在迭代过程中将其从‘float64’转换为‘float16’并保存在列表中

紧接着将所有文件拼接保存在一个新的dataframe中

在dataframe中可以快速进行数据处理

将dataframe转换成文件格式

优化后的dataframe可以转换成任何文件格式

推荐feather,因为较为轻量,如下所示

读取优化后的文件

再次读取优化后的feather格式文件就不会出现任何内存错误

可以正常进行数据处理操作

OK,完事,开摆

【干货】将33G数据集转为3G,这个案例值得学习的评论 (共 条)

分享到微博请遵守国家法律