数据预处理pandas pd.json_normalize占用内存过大优化

问题描述

从ES下载数据,数据格式为json,然后由pandas进行解析,json中的嵌套字段会进行展开作为列名(由于维度初期无法预测,所以根据数据有啥列就使用啥列,这是最方便的点),变成表格,方面了后续的处理,但在使用过程却发现原本6.xG的数据量在解析,预处理时候会变成60多G,甚至80G的内存占用,资源难以满足

解决

为了方便测试,使用了一个300MB大小的数据进行测试
1.为什么原本的300MB数据量会占用2G内存呢,仅仅下面一个操作

df = pd.json_normalize(datas)

思考:
(1)python是面向全对象语言,所以里面每一个数值都会是对象,这个对象很大
(2)数据集合json中的指标字段并不对齐,例如datas = [{field1:100},{“field1”:90,“field2”:12}],既然pandas是表格,总要填充
验证思考1
查询pd对象,果然用大的对象来存储,数据表中共有2732列,13列是等文本数据对应object,2675为float64,44列为int64,然而pd.json_normalize方法没有设置字段类型

print(df.info())
------------------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100000 entries, 0 to 99999
Columns: 2732 entries, feild1 to feild2
dtypes: float64(2675), int64(44), object(13)
memory usage: 2.0+ GB

在这里插入图片描述
验证思考2
其中一个json有新的字段score,发现增加24个字节,说明每条8字节,做了填充

a1 = json.loads('{"name":"zhangsan","age":12}')
a2 = json.loads('{"name":"zhangsan","age":12}')
a3 = json.loads('{"name":"zhangsan","age":12}')
aa = list()
aa.append(a1)
aa.append(a2)
aa.append(a3)
df = pd.json_normalize(aa)
print(df.info())
---------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   name    3 non-null      object
 1   age     3 non-null      int64 
dtypes: int64(1), object(1)
memory usage: 176.0+ bytes
a1 = json.loads('{"name":"zhangsan","age":12}')
a2 = json.loads('{"name":"zhangsan","age":12}')
a3 = json.loads('{"name":"zhangsan","age":12,"scroe":100}')
print(df.info())
---------------------------
memory usage: 200.0+ bytes

解决问题:
(1)如果原始datas数据量太大,那么只能使用pd.json_normalize分批读取后保存csv,(后面合并的时候可能会涉及拼接,这里不展开)
(2)读取csv,指定字段和字段类型,例如读取浮点类型的字段,这里单精度float32就可以啦

pd.read_csv(path, usecols=["浮点列1","浮点列2"], dtype=np.float32)

2.可能中间过程还会涉及拆分训练集,验证集,标准化等,还可以使用del先释放不需要的内存(注意del的对象要确保无引用,否则del无效)

train_x, valid_x, train_y, valid_y = train_test_split(datas, y_index, y, test_size=0.3, random_state=42)
del datas #确保datas无其他引用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值