当前位置: 首页 > news >正文

内存优化技巧:让数据处理更高效

Pandas无疑是我们数据分析时一个不可或缺的工具,它以其强大的数据处理能力、灵活的数据结构以及易于上手的API赢得了广大数据分析师和机器学习工程师的喜爱。

然而,随着数据量的不断增长,如何高效、合理地管理内存,确保Pandas DataFrame在运行时不会因内存不足而崩溃,成为我们每一个人必须面对的问题。

在这个信息爆炸的时代,数据规模呈指数级增长,如何优化内存使用,不仅关乎到程序的稳定运行,更直接关系到数据处理的效率和准确性。通过本文,你将了解到一些实用的内存优化技巧,帮助你在处理大规模数据集时更加得心应手。

1. 准备数据

首先,准备一些包含各种数据类型的测试数据集。
封装一个函数(fake_data),用来生成数据集,数据集中包含后面用到的几种字段。

import pandas as pd
import numpy as npdef fake_data(size):"""根据测试数据集:age:整数类型数值grade:有限个数的字符串qualified:是否合格ability:能力评估,浮点类型数值"""df = pd.DataFrame()df["age"] = np.random.randint(1, 30, size)df["grade"] = np.random.choice(["一年级","二年级","三年级","四年级","五年级","六年级",],size,)df["qualified"] = np.random.choice(["合格", "不合格"], size)df["ability"] = np.random.uniform(0, 1, size)return df

2. 检测内存占用

使用上面封装的函数(fake_data)先构造一个包含一百万条数据的DataFrame

df = fake_data(1_000_000)
df.head()

image.png

看看优化前的内存占用情况:

df.info()

image.png


内存占用大约 26.7MB 左右。

3. 优化内存

接下来,我们开始一步步优化DataFrame的内存占用,
并测试每一步优化之后的内存使用情况和运行性能变化。

3.1. 优化整型数据

首先,优化整型数据的内存占用,也就是测试数据中的年龄age)字段。
从上面df.info()的结果中,我们可以看出,age的类型是int32(也就是用32位,8个字节来存储整数)。
对于年龄来说,用不到这么大的整数,用int8(数值范围:-128~127)来存储绰绰有余。

df["age"] = df["age"].astype("int8")
df.info()

image.png


优化之后,内存占用从26.7+ MB减到23.8+ MB

3.2. 优化浮点型数据

接下来优化浮点类型数据,也就是测试数据中的能力评估值ability)。
测试数据中ability的值是6位小数,类型是float64
转换成float16可能会改变值,所以这里转换成float32

df["ability"] = df["ability"].astype("float32")
df.info()

image.png


优化之后,内存占用进一步从23.8+ MB减到20.0+ MB

3.3. 优化布尔型数据

接下来,优化测试数据中的是否合格qualified),
这个值虽然是字符串类型,但是它的值只有两种(合格不合格),所以可以转换成布尔类型

df["qualified"] = df["qualified"].map({"合格": True, "不合格": False})
df.info()

image.png


优化之后,内存占用进一步从20.0+ MB减到13.4+ MB

3.4. 使用category类型

最后,我们再优化剩下的字段--年级grade)。

这个字段也是字符串,不过它的值只有6个,虽然无法转换成布尔类型(布尔类型只有两种值TrueFalse),但是它可以转换为pandas中的 category 类型。

df["grade"] = df["grade"].astype("category")
df.info()

image.png


优化之后,内存占用进一步从13.4+ MB减到6.7+ MB

4. 总结

各类字段优化之后,内存占用从刚开始的26.7+ MB减到6.7+ MB,优化的效果非常明显。

仅仅是数据类型的简单调整,就带来了如此之大的内存效率提升,
这也给我们带来启示,在数据分析的过程中,构造DataFrame时,也可以根据数值的范围,特点等,
来赋予它合适的类型,不要一味简单的使用字符串,或者默认的整数(int32),默认的浮点(float64)等类型。

相关文章:

  • 【数据结构】排序(下)
  • 前端基础操作1——利用nvm任意切换(管理)node版本
  • Nuxt快速学习开发 - Nuxt3静态资源Assets
  • Vue3 + Ant-Design 中 a-date-picke 实现选择切换年份 没有鼠标光标,输入框内自带‘年’
  • leetcode27移除元素
  • 无版权图片素材搜索网站,解决无版权图片查找问题
  • 逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
  • [贪心算法]忍者道具
  • Redis精要
  • yolov8训练中出现问题
  • Linux 一键部署 Nginx1.26.1 + ModSecurity3
  • Docker的常见问题
  • LoRa126X系列LoRa模块:专为物联网设计而生
  • adb 截屏和录屏命令
  • nginx安装教程
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【技术性】Search知识
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • canvas 五子棋游戏
  • CSS魔法堂:Absolute Positioning就这个样
  • es6要点
  • Facebook AccountKit 接入的坑点
  • java概述
  • js操作时间(持续更新)
  • React Native移动开发实战-3-实现页面间的数据传递
  • RxJS: 简单入门
  • Vue小说阅读器(仿追书神器)
  • 闭包,sync使用细节
  • 基于axios的vue插件,让http请求更简单
  • 类orAPI - 收藏集 - 掘金
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 小程序01:wepy框架整合iview webapp UI
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 自动记录MySQL慢查询快照脚本
  • 说说我为什么看好Spring Cloud Alibaba
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​Redis 实现计数器和限速器的
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #if #elif #endif
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #职场发展#其他
  • $ git push -u origin master 推送到远程库出错
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (2)Java 简介
  • (Java入门)抽象类,接口,内部类
  • (二)斐波那契Fabonacci函数
  • (论文阅读30/100)Convolutional Pose Machines
  • (转)ABI是什么
  • (转)EXC_BREAKPOINT僵尸错误
  • (自用)仿写程序
  • ./configure、make、make install 命令
  • .apk文件,IIS不支持下载解决