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

2024-06-21 14:04

本文主要是介绍内存优化技巧:让数据处理更高效,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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)等类型。

这篇关于内存优化技巧:让数据处理更高效的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

【EverEdit】活用 EverEdit 小技巧

【EverEdit】活用 EverEdit 小技巧 (1)设置 EverEdit 对比文件文本内容 设置如下图所示: 首先要先打开要对比的文本文件,和对比文件相比,此时打开了至少两个文件: 选择文件比较: (2)如何设置 EverEdit 监视文件的变化 设置如下图所示:

LangChain转换链:让数据处理更精准

1. 转换链的概念 在开发AI Agent(智能体)时,我们经常需要对输入数据进行预处理,这样可以更好地利用LLM。LangChain提供了一个强大的工具——转换链(TransformChain),它可以帮我们轻松实现这一任务。 转换链(TransformChain)主要是将 给定的数据 按照某个函数进行转换,再将 转换后的结果 输出给LLM。 所以转换链的核心是:根据业务逻辑编写合适的转换函

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

邮件群发推送的方法技巧?有哪些注意事项?

邮件群发推送的策略如何实现?邮件推送怎么评估效果? 电子邮件营销是现代企业进行推广和沟通的重要工具。有效的邮件群发推送不仅能提高客户参与度,还能促进销售增长。AokSend将探讨一些关键的邮件群发推送方法和技巧,以帮助企业优化其邮件营销策略。 邮件群发推送:目标受众 了解他们的需求、兴趣和行为习惯有助于你设计出更具吸引力和相关性的邮件内容。通过收集和分析数据,创建详细的客户画像,可以更精

服务器雪崩的应对策略之----SQL优化

SQL语句的优化是数据库性能优化的重要方面,特别是在处理大规模数据或高频访问时。作为一个C++程序员,理解SQL优化不仅有助于编写高效的数据库操作代码,还能增强对系统性能瓶颈的整体把握。以下是详细的SQL语句优化技巧和策略: SQL优化 1. 选择合适的数据类型2. 使用索引3. 优化查询4. 范式化和反范式化5. 查询重写6. 使用缓存7. 优化数据库设计8. 分析和监控9. 调整配置1、

Android SurfaceFlinger——图形内存分配器(十一)

前面的文章中的图层合成器(HWC),这里我们接着看一下 SurfaceFlinger 中的另一个重要服务——图形内存分配器。 一、简介         android.hardware.graphics.allocator@2.0 是 Android 系统中硬件抽象层(HAL)的一个组件,专门用于图形内存的分配和管理。它是 SurfaceFlinger 在处理图形数据时所依赖的

Java中如何优化数据库查询性能?

Java中如何优化数据库查询性能? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Java中如何优化数据库查询性能,这是提升应用程序响应速度和用户体验的关键技术。 优化数据库查询性能的重要性 在现代应用开发中,数据库查询是最常见的操作之一。随着数据量的增加和业务复杂度的提升,数据库查询的性能优化显得尤为重

Java中的正则表达式使用技巧

Java中的正则表达式使用技巧 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们来探讨一下Java中正则表达式的使用技巧。正则表达式是一种强大的工具,用于字符串匹配、替换和分割等操作。掌握正则表达式能够大大提高我们处理文本数据的效率。 1. 正则表达式的基本概念 正则表达式(Regular Expression,简称