python pandas 优化内存占用(一)
最近我用python处理excel,使用的是pandas库,我发现pandas库非常占用内存,一直想研究下如何优化pandas的内存占用,但一直没腾出空来,最近终于有时间研究一把了,我先把优化方法写上,如果你想了解更多的内容,可以看一下XX这篇文章,我优化的思路来源https://www.sohu.com/a/484114754_121124370这篇文章。
以下直接提供了优化方法,如果你想知道为什么这么做,可以参考我的另一篇文章链接: python pandas 优化内存占用(二)
1.优化结果
1.1 优化前
我优化的是一个20万行,88列的excel文件,源文件有76.59M,因为业务敏感性的原因,源文件我不能贴出来。
先看一下优化之前excel占用了多少内存
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 200000 entries, 0 to 199999
# Data columns (total 88 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 column0 200000 non-null int64
# 1 column1 200000 non-null object
# 2 column2 200000 non-null int64
......
# 85 column85 199963 non-null float64
# 86 column86 199963 non-null object
# 87 column87 199963 non-null float64
# dtypes: float64(14), int64(3), object(71)
# memory usage: 965.9 MB
上面的输出我精简了一下,从上边的输出可以看出,我的excel文件有200000行,88列,其中有14个float64类型的列,3个int64类型的列,71个ojbect类型的列,总共占用内存965.9M。
上面的输出是使用如下的代码得到的。
gl.info(memory_usage='deep')
1.2 优化后
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 200000 entries, 0 to 199999
# Data columns (total 88 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 column0 200000 non-null uint64
# 1 column1 200000 non-null object
# 2 column2 200000 non-null uint64
......
# 84 是否小区 199963 non-null category
# 85 column85 199963 non-null category
# 86 column86 199963 non-null category
# 87 column87 199963 non-null category
# dtypes: category(81), object(5), uint64(2)
# memory usage: 143.8 MB
同样,我把优化后的输出也精简了一下,从上边的输出可以看出,我这个200000行,88列的excel文件优化后占用内存143.8M,优化效果还是非常明显的。
细心的小伙伴可能注意到一个问题,优化后,我的execl文件的列类型变化了,优化前有14个float64类型的列,3个int64类型的列,71个ojbect类型的列;优化后变成了81个category类型的列,5个object类型列,2个uint64类型的列。没错,正如你看到的,这就是优化的秘密,为什么这样可以优化内存使用,可以参看我的另一篇文章,下面我讲一下我是如何做到的。
2. 优化方法
正如小伙伴在上文中看到的,要想优化excel的内存占用大小,一个重要的思路是改变excel的列类型,如何获取优化后的列类型呢,代码如下
import pandas as pd
# 把excel中的数据类型转化成优化后的数据类型
def convert_to_right_type():# 读取文件gl = pd.read_excel("xx.xlsx")# 初始化一个DataFrameconverted_obj = pd.DataFrame()# 计算哪些列类型可以转换成category类型for col in gl.columns:num_unique_values = len(gl[col].unique())num_total_values = len(gl[col])if num_unique_values / num_total_values < 0.5:converted_obj.loc[:, col] = gl[col].astype('category')else:converted_obj.loc[:, col] = gl[col]# 计算哪些int类型列可以downcast成子类型gl_int = converted_obj.select_dtypes(include=['int'])converted_int = gl_int.apply(pd.to_numeric, downcast='unsigned')# 将转换后的int类型列合并回converted_objfor col in converted_int.columns:converted_obj[col] = converted_int[col]# 计算哪些float类型列可以downcast成子类型gl_float = converted_obj.select_dtypes(include=['float'])converted_float = gl_float.apply(pd.to_numeric, downcast='float')# 将转换后的 float 类型列合并回converted_objfor col in converted_float.columns:converted_obj[col] = converted_float[col]# 获取数据类型索引(索引是列名,值是数据类型)dtypes = converted_obj.dtypes# 获取列名dtypes_col = dtypes.index# 获取数据类型的名称dtypes_type = [i.name for i in dtypes.values]# 列名和类型字典column_types = dict(zip(dtypes_col, dtypes_type))# preview = {key: value for key, value in list(column_types.items())[:20]}# 获取字典preview = {key: value for key, value in list(column_types.items())}# 格式化输出, 使每个嵌套层级的缩进量为4个空格pp = pprint.PrettyPrinter(indent=4)# 打印字典pp.pprint(preview)
这段儿代码的输出类似如下:
column_types = {'column1': 'category','column2': 'uint64','column3': 'object','column4': 'uint64','column5': 'category'}
column_type 是个字典,它的key是excel文件的列名称,value是excel文件列对应的优化后的类型。
在读取excel的时候,指定excel的dtype,即可按照指定的列类型读取excel,类似这样
gl = pd.read_excel("XX.xlsx", dtype=column_types)
3. 测试方法
我是用如下的代码测试excel占用内存的大小的
# 测试内存占用
def mem_usage(pandas_obj):if isinstance(pandas_obj, pd.DataFrame):usage_b = pandas_obj.memory_usage(deep=True).sum()else: # we assume if not a df it's a seriesusage_b = pandas_obj.memory_usage(deep=True)usage_mb = usage_b / 1024 ** 2 # convert bytes to megabytesreturn "{:03.2f} MB".format(usage_mb)
相关文章:
python pandas 优化内存占用(一)
最近我用python处理excel,使用的是pandas库,我发现pandas库非常占用内存,一直想研究下如何优化pandas的内存占用,但一直没腾出空来,最近终于有时间研究一把了,我先把优化方法写上,如果你想了解更…...
FutureCompletableFuture实战
1. Callable&Future&FutureTask介绍 直接继承Thread或者实现Runnable接口都可以创建线程,但是这两种方法都有一个问题就是:没有返回值,也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现这一场景,而Fu…...
Loki 微服务模式组件介绍
目录 一、简介 二、架构图 三、组件介绍 Distributor(分发器) Ingester(存储器) Querier(查询器) Query Frontend(查询前端) Index Gateway(索引网关)…...
peerDependencies对等依赖
在 package.json 中平时常用的有字段有 dependencies 和 devDependencies,但 peerDependencies 平时都没咋看到过,今天具体讲讲 peerDependencies 的作用 一、什么是对等依赖 peerDependencies 可以翻译为“对等依赖”或“同行依赖”。这个术语在 npm …...
贪心算法 part01
class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值(相当于不断确定最大子序终止位置ÿ…...
java开发入门学习二 - 变量
目录 一 关键字 编辑 二 标识符 三 变量 变量数据类型 变量注意点 四 数据类型 前置知识 - 计算机存储单位 整型数据类型 浮点数据类型 字符数据类型 布尔数据类型 五 数据类型间的计算 基本数据类型之间的计算 自动类型提升 强制类型转换 引用数据类型 Sti…...
Qt Q_ENUM enum 转 QString 枚举字符串互转; C++模板应用
Part1: Summary 项目中我们常用到命名,使用 enum 转成 string ,方便简洁;Qt给我们提供了一个很方便的功能 Q_ENUM,可以实现枚举字符串互转; Q_ENUM宏将枚举注册到元对象系统中; QMetaEnum::fromType获取枚…...
0004.基于springboot+elementui的在线考试系统
适合初学同学练手项目,部署简单,代码简洁清晰; 愿世界和平再无bug 一、系统架构 前端:vue| elementui 后端:springboot | mybatis-plus 环境:jdk1.8 | mysql | maven 二、登录角色 1.管理员 2.老师 …...
基于 iAP2 协议 的指令协议,用于对安防设备的 MCU 进行操作
协议设计目标 1. 安全性:通过 iAP2 协议与 MCU 设备进行安全通信。 2. 通用性:支持对安防设备的常见功能进行操作,如状态查询、设备控制、参数配置等。 3. 高效性:数据结构简洁清晰,易于解析和扩展。 4. 扩展性&#x…...
02-5.python入门基础一控制流(while)
Python 控制流是指控制程序执行顺序的机制,它允许程序根据不同的条件和情况执行不同的代码块或重复执行某些代码。 while 循环的用法与示例 语法结构及要点 在 Python 中,while循环是一种基于条件判断的循环结构,其语法构成如下:…...
Go语言开发入门与实战
Go语言(简称Golang)由Google开发,是一门现代化的编程语言,因其简洁高效、并发支持友好、跨平台特性而在后端服务开发、云计算等领域大放异彩。本文将介绍Go语言的基本特点、开发环境配置,并通过一个简单的实战项目带领大家快速上手。 一、Go语言的特点 简单易学:语法简洁…...
HarmonyOS Next应用开发实战:ArkWeb组件使用介绍及使用举例
ArkWeb简介 ArkWeb(方舟Web)是HarmonyOS Next中提供的一个Web组件,主要用于在应用程序中显示Web页面内容。这个组件使得开发者可以在HarmonyOS应用中嵌入Web页面,从而降低开发成本,提升开发和运营效率。 使用场景 A…...
【已解决】在Visual Studio里将应用与Microsoft Store关联时提示网络异常
发布Windows应用时。在Visual Studio里点击"发布“,将应用与Microsoft Store关联时,一直提示网络错误。 查了一下论坛,发现之前也经常出现,但我是第一次遇到。 不能就这样一直被卡着呀,研究了一下,还…...
springcloud-gateway获取应用响应信息乱码
客户端通过springcloud gateway跳转访问tongweb上的应用,接口响应信息乱码。使用postman直接访问tongweb上的应用,响应信息显示正常。 用户gateway中自定义了实现GlobalFilter的Filter类,在该类中获取了上游应用接口的响应信息,直…...
[笔记]关于Qt的nativeEvent事件无法接收window消息的Bug
1.nativeEvent事件无法接收window消息 此处不是nativeEvent不能接收,是possmessage一定要写对发送的软件名称,这个名称在Qt中是主界面类的名称,就是主界面UI的名称,而不是rc文件中定义的名称。 所以在FindWindow函数获取目标窗口…...
LeetCode 热题 100_K 个一组翻转链表(31_25_困难_C++)(四指针法)
LeetCode 热题 100_K 个一组翻转链表(31_25) 题目描述:输入输出样例:题解:解题思路:思路一(四指针法): 代码实现代码实现(思路一(四指针法&#x…...
Pytorch | 从零构建MobileNet对CIFAR10进行分类
Pytorch | 从零构建MobileNet对CIFAR10进行分类 CIFAR10数据集MobileNet设计理念网络结构技术优势应用领域 MobileNet结构代码详解结构代码代码详解DepthwiseSeparableConv 类初始化方法前向传播 forward 方法 MobileNet 类初始化方法前向传播 forward 方法 训练和测试训练代码…...
CSS系列(18)-- 工程化实践详解
前端技术探索系列:CSS 工程化实践详解 🏗️ 致读者:探索 CSS 工程化之路 👋 前端开发者们, 今天我们将深入探讨 CSS 工程化实践,学习如何在大型项目中管理 CSS。 工程化配置 🚀 项目结构 …...
日拱一卒(18)——leetcode学习记录:二叉树中的伪回文路径
一、题目 给你一棵二叉树,每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的,当它满足:路径经过的所有节点值的排列中,存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。 二、思路 …...
hive—炸裂函数explode/posexplode
1、Explode炸裂函数 将hive某列一行中复杂的 array 或 map 结构拆分成多行(只能输入array或map) 语法: select explode(字段) as 字段命名 from 表名; 举例: 1)explode(array)使得结果中将array列表里的每个元素生…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
