加粗样式几年前在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格式文件就不会出现任何内存错误
可以正常进行数据处理操作
更多干货尽在公众号【啥都会一点的研究生】