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

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

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

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

依赖库

import pandas as pd
import gc
import glob
import os

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

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

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

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

分块(chunk)

chunk_size = 500000
num = 1
for chunk in pd.read_csv('test_data.csv', chunksize = chunk_size):
    chunk.to_csv('chunk' + str(num) + '.csv', index = False)
    gc.collect()
    num += 1

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

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

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

运行后得到若干个chunk
在这里插入图片描述

扫描二维码关注公众号,回复: 14820039 查看本文章

然后查看是否可以读取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格式文件就不会出现任何内存错误

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

在这里插入图片描述
更多干货尽在公众号【啥都会一点的研究生】

猜你喜欢

转载自blog.csdn.net/zzh516451964zzh/article/details/129334725
今日推荐