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

文章介绍了在处理大规模数据集时,如何避免系统卡顿崩溃。通过使用pandas的chunksize参数分块读取CSV文件,避免一次性加载全部数据。在每个块中,将float64类型转换为float16以减少内存使用,然后拼接和优化所有块,最终保存为轻量级的feather格式文件,实现高效的数据存储和处理。
摘要由CSDN通过智能技术生成

加粗样式几年前在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
在这里插入图片描述

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥都生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值