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

2023-11-21 10:52

本文主要是介绍数据预处理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      object1   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无其他引用

这篇关于数据预处理pandas pd.json_normalize占用内存过大优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/401901

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则