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

news2024/11/26 0:42:17

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

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

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

1. 准备数据

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

import pandas as pd
import numpy as np

def 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.coloradmin.cn/o/1845780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue中实现百度地图全国与省市地图切换

前言 本文主要是用于示例全国地图,点击省市地图直接跳转到该省市地图并展示,可以拓展在地图上显示标记点(本文未做示例),后续有完整代码,但是由于需要与本来项目业务代码进项分割,可能会有些问题…

centos 7无需token编译安装freeswitch 1.10.11 ——筑梦之路

准备工作 安装编译工具和依赖包 yum update -y sudo yum install epel-release vim tcpdump net-tools.x86_64 -y sudo yum install gcc-c sqlite-devel zlib-devel libcurl-devel pcre-devel speex-devel ldns-devel libedit-devel openssl-devel git -y yum install yasm n…

Web APIs--Dom获取属性操作

目录 1.DOM(操作网页内容、用户交互) 2.DOM对象获取(querySelect(‘’)、querySelectAll(‘’)) 总结: 3.操作元素内容(修改元素的文本更换内容) 1. 元素innerText 属性 2.元素.innerHTML…

JavaSE 面向对象程序设计初级 静态static 包package 常量final 代码块 代码实操理论内存原理详解

目录 static(静态) 静态的特点 应用示例 静态变量 静态方法 注意事项 内存图 重新认识main方法 包 什么是包 使用导包在什么时候 final关键字 常量 命名规范 细节(重点) 权限修饰符 代码块 局部代码块 构造代码块 静态代码块 个人号…

【机器学习】必会降维算法之:随机投影(Random Projection)

随机投影(Random Projection) 1、引言2、随机投影(Random Projection)2.1 定义2.2 核心原理2.3 应用场景2.4 实现方式2.5 算法公式2.6 代码示例 3、总结 1、引言 小屌丝:鱼哥,降维算法还没讲完呢。 小鱼&a…

EE trade:炒伦敦金的注意事项及交易指南

在贵金属市场中,伦敦金因其高流动性和全球认可度,成为广大投资者的首选。然而,在炒伦敦金的过程中,投资者需要注意一些关键点。南华金业小编带您一起来看看。 国际黄金报价 一般国际黄金报价会提供三个价格: 买价(B…

c++里 父类私有的虚函数,也是可以被子类重写和继承的。但父类私有的普通函数,子类无法直接使用

谢谢 。今天看课本上有这么个用法,特测试一下。这样就也可以放心的把父类的私有函数列为虚函数了,或者说把父类的虚函数作为私有函数了。 再补充一例:

ls命令的参数选项

ls命令的参数的作用 可以指定要查看的文件夹(目录)的内容,如果不指定参数,就查看当前工作目录的内容。ls 命令的选项 常用语法:ls [-a -l -h] [linux路径] -a 选项表示 all ,即列出全部内容,包括…

Linux文件编程详解

Linux文件编程详解 在Ubuntu(Linux)系统下进行文件操作涉及一系列的系统调用,这些调用是基于Unix风格的文件操作API。这些操作包括打开或创建文件、从文件中读取数据、向文件中写入数据、移动文件指针以及关闭文件。以下是这些函数的详细介绍…

WPF/C#:在DataGrid中显示选择框

前言 在使用WPF的过程中可能会经常遇到在DataGrid的最前或者最后添加一列选择框的需求,今天跟大家分享一下,在自己的项目中是如何实现的。 整体实现效果如下: 如果对此感兴趣,可以接下来看具体实现部分。 实践 假设数据库中的…

LeetCode LCP 61. 气温变化趋势

别怕麻烦&#xff0c;模拟题有时候就是要多写一些条件&#xff08;或者你思维很活跃找出规律&#xff09;&#xff0c;代码如下&#xff1a; class Solution { public:int temperatureTrend(vector<int>& temperatureA, vector<int>& temperatureB) {int …

GraphQL vs REST:API设计的现代选择

随着技术的飞速发展&#xff0c;API&#xff08;应用程序接口&#xff09;设计成为了软件开发中不可或缺的一部分。REST&#xff08;Representational State Transfer&#xff09;和GraphQL作为两种主流的API设计风格&#xff0c;各自具有独特的优势和适用场景。本文将深入探讨…

audacity音频处理

1.安装 Audacity | Free Audio editor, recorder, music making and more! 添加OpenVINO插件: https://zhuanlan.zhihu.com/p/676542556 2.使用 2.1注意事项 1.编辑音频,点击左上方打开或导入都可以;打开视频文件则需要安装ffmpeg模块,打开后只显示视频中的音频信息; 2.编辑…

手机k歌用什么麦克风最好?轻揭无线麦克风哪个品牌音质最好!

​无线领夹麦克风作为现代音频技术的重要代表&#xff0c;已广泛应用于各种场合。它不仅能提升演讲者声音质量&#xff0c;还能增加演讲互动性和生动性。然而面对众多产品如何选择适合自己的设备成难题。本文将提供选购使用无线领夹麦克风的建议与推荐款式&#xff0c;帮助你轻…

一文带你全面详细了解安全运维

一、安全运维-网络 1、IP地址相关 IP地址属于网络层地址&#xff0c;用于标识网络中的节点设备。 IP地址由32bit构成&#xff0c;每8bit一组&#xff0c;共占用4个字节。 IP地址由两部分组成&#xff0c;网络位和主机位。 IP地址分类&#xff1a; 类别网络位子网掩码私有地…

tomcat常用配置详解和优化方法

常用配置详解 1 目录结构 /bin&#xff1a;脚本文件目录。 /common/lib&#xff1a;存放所有web项目都可以访问的公共jar包&#xff08;使用Common类加载器加载&#xff09;。 /conf&#xff1a;存放配置文件&#xff0c;最重要的是server.xml。 /logs&#xff1a;存放日志文件…

vue 基于antV 实现流程图编辑器代码

最近在做流程图功能开发&#xff0c;发现阿里antV 有对应的可视化引擎&#xff0c;于是自己做了一个简单vue 基于antV 实现流程图编辑器代码 部分代码如下&#xff1a; <template><div id"flowEditorContent"><header><h3>antv X6 流程编辑…

iptables(4)规则匹配条件

简介 前面我们已经介绍了iptables的基本原理,表、链,数据包处理流程。如何查询各种表的信息。还有基本的增、删、改、保存的基础操作。 经过前文介绍,我们已经能够熟练的管理规则了,但是我们只使用过一种匹配条件,就是将”源地址”作为匹配条件。那么这篇文章中,我们就来…

搞IT需不需要考个软考中级?

如果你是在事业单位、银行、国企等体制内工作&#xff0c;建议考虑参加软考。通过软考评职称后&#xff0c;可以获得加薪和晋升的机会&#xff0c;而且晋升时也会更看重你的职称等级。我就是通过软考评定了中级职称&#xff0c;薪水涨了500元。 评职称并不仅仅是拿到证书就行&…

Talk|北京大学张嘉曌:NaVid - 视觉语言导航大模型

本期为TechBeat人工智能社区第602期线上Talk。 北京时间6月20日(周四)20:00&#xff0c;北京大学博士生—张嘉曌的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “NaVid - 视觉语言导航大模型”&#xff0c;NaVid是首个专为视觉语言导航&#xf…