首页 > 系统相关 >python pandas 优化内存占用(一)

python pandas 优化内存占用(一)

时间:2024-12-22 22:28:03浏览次数:6  
标签:non obj python excel pandas converted 内存 优化 col

        最近我用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")
    # 初始化一个DataFrame
    converted_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_obj
    for 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_obj
    for 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 series
        usage_b = pandas_obj.memory_usage(deep=True)

    usage_mb = usage_b / 1024 ** 2  # convert bytes to megabytes
    return "{:03.2f} MB".format(usage_mb)

标签:non,obj,python,excel,pandas,converted,内存,优化,col
From: https://blog.csdn.net/dydyswr/article/details/144520264

相关文章

  • LargeSystemCache=1 启用“大型系统缓存”,适用于高内存的服务器,能提高文件系统的缓存
    "LargeSystemCache"=dword:00000000这一行通常出现在Windows操作系统的注册表设置中,涉及到系统内存管理的配置,特别是与文件缓存(FileCache)相关的部分。它具体控制Windows操作系统如何使用系统内存来缓存文件系统数据。下面逐个回答你的问题:1. 为什么(Why)"LargeSystemCac......
  • Python 函数
    一,函数的定义与调用:当你在写程序时,有一个模块一直用的是相同的的代码,所以我们为了提高代码的效率和代码的重用,所以把具有独立的代码块组织为一个小模块,我们把他叫为函数。在Python中,函数是一段可重复使用的代码块,用于执行特定的任务。它通过def关键字来定义函数。defgreet......
  • 基于python实现用户注册与校验
    实现用户注册与校验common—源码"""一、基础功能需求1. 综合使用当前所学知识,如列表、字典、字符串、函数等,实现一个基于命令行的用户注册功能。2. 用户注册时必须要输入用户名、密码、手机号码,用针对用户的输入必须进行验证。3. 用户名的规则:只能是大小写字母或数字......
  • Python实例之函数基础打卡篇
    大家晚上好~今日学习之函数打卡。要求:自动打卡定义一个函数,函数名任意,要求调用函数后实现自动打卡;上午打卡时间为8点到9点,下午打卡时间为14点到15点,让用户输入打卡时间,如果时间在8点到9点之间,提示”早上好,打卡成功新的一天“,如果时间在14点到15点之间,提示“下午好,打卡成功不......
  • 数据再内存中的存储
    ①练习一:#include<stdio.h>#include<string.h>intmain(){ chara=-1; signedcharb=-1; unsignedcharc=-1; printf("a=%db=%dc=%d",a,b,c); return0;}结果:-1 -1 255分析:②练习一://练习2#include<stdio.h>int......
  • python怎么看矩阵维数
    print(X.shape):查看矩阵的行列号print(len(X)):查看矩阵的行数print(X.ndim):查看矩阵的维数1、查看矩阵的行列号2、查看矩阵的行数3、查看矩阵的维数......
  • python中怎么提取关键词
    简单的关键词提取文章内容关键词的提取分为三大步: (1)分词 (2)去停用词 (3)关键词提取分词方法有很多,我这里就选择常用的结巴jieba分词;去停用词,我用了一个停用词表。具体代码如下:import jiebaimport jieba.analyse#第一步:分词,这里使用结巴分词全模式text = '''......
  • Python字符串及正则表达式(十一):正则表达式、使用re模块实现正则表达式操作
    前言:在Python编程的广阔天地中,字符串处理无疑是一项基础而关键的技能。正则表达式,作为处理字符串的强大工具,以其灵活的模式匹配能力,在文本搜索、数据清洗、格式验证等领域发挥着不可替代的作用。本系列博客已经带领大家逐步深入了Python字符串操作的多个方面,从基础的字......
  • Python大学生课程在线考试组卷管理系统
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍考试管理系统主要是为了用户方便对班级信息、通知公告、课程信息、试题管理、试卷、......
  • python毕设 篮球俱乐部管理系统论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于篮球俱乐部管理系统的研究,现有研究主要以传统管理模式或单一功能模块为主。在国内外,针对篮球俱乐部全面管理,如集成会员管理、场地......