缓解pandas中DataFrame占用内存过大的问题

2023-05-16

本文最后修改于2018-01-21,文章有问题或者转载请及时联系本人,如果对你有帮助,别忘了点下关注~

0 背景

在我们使用pandas进行数据处理的时候,有时候发现文件在本地明明不大,但是用pandas以DataFrame形式加载内存中的时候会占用非常高的内存,本文即解决这样的问题。

1 原因

如果是计算机相关专业的同学,你应该知道int8,int16,int64的区别。如果你忘记了,那我们可以举一个例子。内存相当于仓库,数字相当于货物,数字需要装到箱子里才能堆到仓库。现在有小,中,大三种箱子,我们一个个数字用小箱子就可以装好,然后堆到仓库去,而现在pandas的处理逻辑是,如果你不告诉用哪个箱子,我都会用最大的箱子去装,这样仓库很快就满了。OK,这就是有时候DataFrame内存占用过高的原因。

常用的数据类型范围如下所示:

header 1范围下限(含)范围上限(含)
unit80255
unit16065535
int8-128127
int16-3276832767
int32-21474836482147483647
int64–9,223,372,036,854,775,8089,223,372,036,854,775,807

其他信息可以通过numpy中的函数来查看范围

import numpy as np
# 查看int16的范围
ii16 = np.iinfo(np.int16)
ii16.min
-32768

# 与iinfo相应,finfo可以查看float类型的范围
fi16 = np.finfo(np.float16)
fin16.min
-3.4028235e+38

2 解决方法

第一种

当我们明确知道要加载数据的范围,使用pd.read_table读取数据时,可以用其中的dtype参数来手动指定类型。比如某一列的数据范围肯定在0~255之中,那么我们可以指定为np.uint8类型,如果不手动指定的话默认为np.int64类型,这之间的差距巨大。

第二种

如果数据列数太多,或者不清楚数据具体范围的话这里提供一个脚本,可以自动判断类型,并根据类型修改数据范围。虽然我认为这个脚本已经可以cover大部分的情况,但是仍然强烈建议你在读懂这个脚本的基础上,根据你的数据修改成更适合你数据的形式。

注意:代码最初源于这里Reducing DataFrame memory size by ~65%,在Apache 2.0协议下,我对其中不太合理的地方做了些修改。

# @from: https://www.kaggle.com/arjanso/reducing-dataframe-memory-size-by-65/code
# @liscense: Apache 2.0
# @author: weijian
def reduce_mem_usage(props):
    # 计算当前内存
    start_mem_usg = props.memory_usage().sum() / 1024 ** 2
    print("Memory usage of the dataframe is :", start_mem_usg, "MB")
    
    # 哪些列包含空值,空值用-999填充。why:因为np.nan当做float处理
    NAlist = []
    for col in props.columns:
        # 这里只过滤了objectd格式,如果你的代码中还包含其他类型,请一并过滤
        if (props[col].dtypes != object):
            
            print("**************************")
            print("columns: ", col)
            print("dtype before", props[col].dtype)
            
            # 判断是否是int类型
            isInt = False
            mmax = props[col].max()
            mmin = props[col].min()
            
            # Integer does not support NA, therefore Na needs to be filled
            if not np.isfinite(props[col]).all():
                NAlist.append(col)
                props[col].fillna(-999, inplace=True) # 用-999填充
                
            # test if column can be converted to an integer
            asint = props[col].fillna(0).astype(np.int64)
            result = np.fabs(props[col] - asint)
            result = result.sum()
            if result < 0.01: # 绝对误差和小于0.01认为可以转换的,要根据task修改
                isInt = True
            
            # make interger / unsigned Integer datatypes
            if isInt:
                if mmin >= 0: # 最小值大于0,转换成无符号整型
                    if mmax <= 255:
                        props[col] = props[col].astype(np.uint8)
                    elif mmax <= 65535:
                        props[col] = props[col].astype(np.uint16)
                    elif mmax <= 4294967295:
                        props[col] = props[col].astype(np.uint32)
                    else:
                        props[col] = props[col].astype(np.uint64)
                else: # 转换成有符号整型
                    if mmin > np.iinfo(np.int8).min and mmax < np.iinfo(np.int8).max:
                        props[col] = props[col].astype(np.int8)
                    elif mmin > np.iinfo(np.int16).min and mmax < np.iinfo(np.int16).max:
                        props[col] = props[col].astype(np.int16)
                    elif mmin > np.iinfo(np.int32).min and mmax < np.iinfo(np.int32).max:
                        props[col] = props[col].astype(np.int32)
                    elif mmin > np.iinfo(np.int64).min and mmax < np.iinfo(np.int64).max:
                        props[col] = props[col].astype(np.int64)  
            else: # 注意:这里对于float都转换成float16,需要根据你的情况自己更改
                props[col] = props[col].astype(np.float16)
            
            print("dtype after", props[col].dtype)
            print("********************************")
    print("___MEMORY USAGE AFTER COMPLETION:___")
    mem_usg = props.memory_usage().sum() / 1024**2 
    print("Memory usage is: ",mem_usg," MB")
    print("This is ",100*mem_usg/start_mem_usg,"% of the initial size")
    return props, NAlist

其中NAlist表明是含有空值的列表。经试验,效果明显,对于数值型特征非常多的数据,至少可以减少50%以上的内存占用。

Reference

1 https://www.kaggle.com/arjanso/reducing-dataframe-memory-size-by-65/code

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

缓解pandas中DataFrame占用内存过大的问题 的相关文章

  • iOS中NSThread子线程需要建立NSAutoreleasePool

    今天做iOS开发时碰到一个问题 xff1a 在主线程打开一个大约400多K的文件读取数据时 xff0c 界面明显有停顿感 xff0c 于是尝试用NSThread建立子线程来负责读取文件数据 却发现子线程的运行速度奇慢无比 xff0c 刚开始
  • 报数游戏3

    题目描述 xff1a xfeff xfeff 一种报数游戏是从1开始连续报数 xff0c 如果报到7的倍数 xff08 7 xff0c 14 xff0c 21 xff0c 28 xff09 或者包含数字7的数 xff08 7 xff0c 1
  • c++ 关于流的重要帖子聚集

    1 关于clear 带参数版本 的2个例子 C 43 43 ios clear 用法及代码示例 纯净天空 2 关于unget的一个例子 unget C 43 43 标准库 开发文档 文江博客 3 关于peek的一个例子 C 43 43 中的
  • Mac无法访问Windows共享文件解决办法

    先按照网上教程 xff0c 在Windows下允许远程 xff0c 然后设置文件夹共享出来 xff0c 再在Mac上通过smb登录 xff0c 输入用户名和密码窗口总是抖动 xff0c 一直连接不上 xff0c 此时用另一台同一局域网的Wi
  • 虚拟机VMware安装ArchLinux及配置过程_详细202002_001#

    1 安装前准备工作 安装手册地址 xff1a https wiki archlinux org index php Installation guide版本为archlinux 2020 02 01 x86 64 isoVMware安装 x
  • VSCode C++环境配置

    VSCode C C 43 43 Windows 环境配置 第一次写博客 xff0c 编程小白 xff0c 码龄不足一年 xff0c 望大家批评改正 废话 许多像我一样的初级码农 xff0c 最开始接触的编程语言可能是C语言 xff0c 学
  • 服务器离线安装GitLab

    服务器离线安装GitLab并还原迁移的数据 1 下载gitlab的离线安装包 xff0c 默认el6 我下载的是el7 xff0c 以下简称el7 rpm 最好不要有openssh的rpm文件 2 登录服务器 xff0c 新建一个文件夹 s
  • leetcode刷题B部分

    目录 文章目录 目录50 Pow x n xff08 回到目录 目录 xff09 54 螺旋矩阵 59 xff08 回到目录 目录 xff09 58 最后一个单词的长度 xff08 回到目录 目录 xff09 59 螺旋矩阵 II 54 x
  • 【Java】字符串列表List<String>数字、字母、汉字混合排序(按中国人使用习惯排序)

    一 概要 本方法根据中国人使用习惯实现了 xff1a 总体按照按数字 字母 汉字升序 xff1b 数字之间按数值大小升序排序 xff1b 字母之间按ascii升序排序 xff1b 汉字之间按拼音升序排序 二 方法入口 span class
  • response.buffer用法

    不知道大家对Buffer了解多少 xff0c 很多人对这个概念都比较模糊 xff0c 尤其是在asp中 很多初学者在编写asp程序时很少用到这条语句 xff0c 下面我就来说说Buffer的用途以及它在asp程序中的作用 一 Buffer
  • 安装office时报错:an error occurred during the installation of assmbly component

    方法一 xff1a 删除office相关注册表 1 开始 xff0d xff0d 运行 xff0d xff0d 输入regedit xff0c 回车打开注册表找HKEY CURRENT USER Software Microsoft Off
  • mysql数据库的备份和恢复

    问题 想从我虚拟机上 xff0c 把数据库移到阿里云服务器上 解决方法 备份数据库 数据库名叫dddd mysqldump u root p span class hljs code 96 dddd 96 span gt dddd sql
  • Xcode如何打包Mac程序为 .dmg镜像文件

    打包Mac程序为 dmg镜像文件 获取可运行程序 按住crtl 43 b 编译程序 xff0c 编译完成之后打开Product文件夹 xff0c 选择编译好的程序 xff0c 鼠标右键点击Show in Finder 创建文件夹 在桌面新建
  • c modern approach chapter 17 中简单的复习

    一 程序remind c用动态内存实现 1 先回顾13 5中remind c的实现 xff0c 如下是自己看书以及自己的体会写成的程序 include lt stdio h gt include lt string h gt include
  • iOS Swift Crash的捕获

    iOS Swift Crash的捕获 crash捕获介绍 如果对crash捕获不太了解 xff0c 可以先参考这篇文章 本文进行Mach异常 43 Unix信号方式捕获crash NSException一般只在OC当中被捕获 xff0c 一
  • 基于TextRank的关键词、短语、摘要提取

    基于TextRank的关键词 短语 摘要提取 原创 2016年09月08日 18 20 59 标签 xff1a TextRank scala 自动文摘 3946 关于自动文摘 利用计算机将大量的文本进行处理 xff0c 产生简洁 精炼内容的
  • XCode9: iPhone is busy: Preparing debugger support for iPhone

    XCode9 iPhone is busy Preparing debugger support for iPhone Click on Window menuSelect Device and SimulatorsSelect your
  • 你会写开发文档吗

    你会写软件开发文档吗 xff1f 如今 xff0c 软件开发越来越复杂 xff0c 软件的功能也越来越丰富 而几乎所有成熟的商业软件 xff0c 都是一个开发团队齐心协力的血汗结晶 罗马不是一天建成的 xff0c 当我们震撼于Microso
  • Xcode创建子工程以及工程依赖

    Xcode创建子工程以及工程依赖 背景 由于创建一个app的时候需要引入大量的依赖三方库或者自己写的工具类 所以 考虑新建一个公共工程 每次新建项目 只需要依赖这个工程就可以了 其实说白了这个公共工程就是个静态库 开始开发 1 创建iosL
  • iOS常用第三方库

    iOS常用第三方库 转载 2017年06月13日 17 46 43 下拉刷新 EGOTableViewPullRefresh 最早的下拉刷新控件 SVPullToRefresh 下拉刷新控件 MJRefresh 仅需一行代码就可以为UITa

随机推荐

  • 公务员考试152分上岸经验,你同样可以复制

    公务员考试152分上岸经验 你同样可以复制 xff08 2018公考必看 xff09 来源 xff1a 步知资讯 时间 xff1a 09 26 点击 xff1a 4171261 分享 下载此文章 打印 增大字体 减小字体 单位入职培训都结束
  • 工业机器人理论图谱

    工业机器人分类 xff1a 工业机器人是应用于工业环境下的一类机器人分支 xff08 下文中的 机器人 均指 工业机器人 xff09 xff0c 从结构上可以分为 串联机器人 并联机器人 串联机器人最典型的有 平面2连杆 xff08 实际没
  • HTTP协议

    HTTP协议 常用的HTTP方法HTTP请求报文与响应报文格式常见的HTTP相应状态码常见HTTP首部字段GET方法与POST方法的区别HTTP的缺点与HTTPSHTTP优化 HTTP xff08 超文本传输协议 xff09 是一个基于请求
  • debian10安装apache2 php ftp(网站服务器)

    debian安装网站服务 debian最小安装后重启机器 设置语言 dpkg reconfigure locales 选择en US UTF 8 UTF 8 xff08 其它都不选 xff09 重启机器 修改软件安装源文件 xff08 如果
  • 正则表达式(转载)

    正则表达式的基本语法 开始和结尾位置声明 表示字符串的开始 xff0c 要匹配 本身需要使用 例如 xff1a Yao 表示字符串以 Yao 开头 表示字符串的结尾 xff0c 要匹配 本身需要使用 例如 xff1a Yao 表示字符串以
  • apache2网站设置

    apache2网站设置 我们访问一个网址是先解析成对应的IP的80端口开始的 打开apache2网站配置文件 nano etc apache2 sites available 000 default conf 可以看到 lt Virtual
  • apache用户名和密码验证

    apache用户名和密码验证 之前建立的www soft com这个网站我们给他加个访问验证 修改 etc apache2 apache2 conf nano etc apache2 apache2 conf 把 lt Directory
  • php安装swoole插件

    swoole插件 安装wget apt install wget 安装openssl apt install openssl xff08 https要用到 安装phpize apt install php7 3 dev 安装make apt
  • 五:debian安装,附加审批系统

    如果你还没读第一篇和第二篇请阅读第一篇Debian 安装和第二篇Debian 服务器安装 服务器开始安装审批系统 wget c https jiaozhiguan 1258621244 cos ap guangzhou myqcloud c
  • SpringBoot项目的出现java.io.FileNotFoundException: (系统找不到指定的路径。)

    项目场景 xff1a SpringBoot项目的出现java io FileNotFoundException 系统找不到指定的路径 项目场景 xff1a Springboot用到文件上传下载功能 问题描述 xff1a 问题 xff1a j
  • mysql创建用户报错[Err] 1396 - Operation CREATE USER failed for ‘用户名‘@‘%‘的解决方法

    项目场景 xff1a 执行mysql创建用户语句CREATE USER test IDENTIFIED BY 用户名 问题描述 xff1a 执行mysql创建用户语句CREATE USER test IDENTIFIED BY 39 用户名
  • 解决nginx提示:(code=exited, status=203/EXEC)的错误

    项目场景 xff1a 在centos7上启动nginx1 19 安装过程省略 问题描述 xff1a 编译安装一切顺利 xff0c 使用systemctl start nginx时提示如下内容 xff1a span class token p
  • You don‘t have permission to access this resource.

    项目场景 xff1a 访问自己的搭建的网站时apache报错You don t have permission to access this resource 原因分析 遇到如标题那个问题 xff0c 无法进行远程HTTP请求 解决方案 x
  • cmd下windows批处理bat,获取当前系统时间,生成日志文件名

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 Window系统一 范例二 方法详解1 获取日期2 获取时间3 详解 总结更多 关于Linux的写法 Window系统 常用的Win
  • Centos 7 SSH服务安全加固

    描述 禁止SSH空密码用户登录 xff0c 限制可登录用户及来源地址 加固建议 编辑文件 etc ssh sshd config xff0c 将一应配置修改 具体操作命令和步骤 1 编辑文件 etc ssh sshd config vim
  • 第18章 异常处理

    问题 xff1a c 43 43 异常处理是不是必须有try xff0c 才能有catch 下面自己验证下 方法1 xff1a 如果没有try catch语句块能不能处理异常 xff1f include lt string gt inclu
  • Centos7十五项安全加固标准配置(结合等保3)

    写在前面 xff1a 由于所有操作均涉及系统文件 xff0c 建议所有操作前备份文件及做好相关记录 一 检查系统空密码账户 身份鉴别 描述 检查是否存在空口令和root权限的账号 加固建议 对无口令并且可登录的账户 xff0c 进行密码设置
  • ThinkPHP下 自定义日志输出

    项目场景 xff1a 不想调用TP的 think Log类工具 xff0c 而是自定义日志的输出路径 文件名和内容 xff1a 解决方案 xff1a 提示 xff1a 这里填写该问题的具体解决方案 xff1a 1 首先在common php
  • Ubuntu下代理设置方法

    Ubuntu下代理设置方法 一 临时的手段 在命令行中临时设置 xff0c export http proxy 61 34 http username password 64 proxyIP proxyPort 34 xff0c 和其他临时
  • 缓解pandas中DataFrame占用内存过大的问题

    本文最后修改于2018 01 21 xff0c 文章有问题或者转载请及时联系本人 xff0c 如果对你有帮助 xff0c 别忘了点下关注 0 背景 在我们使用pandas进行数据处理的时候 xff0c 有时候发现文件在本地明明不大 xff0