解决 pandas 读取数据时内存过大的问题
发布日期:2021-07-01 02:10:42
浏览次数:2
分类:技术文章
本文共 2510 字,大约阅读时间需要 8 分钟。
解决 pandas 读取数据时内存过大的问题
背景:
在我们使用pandas进行数据处理的时候,有时候发现文件在本地明明不大,但是用pandas以DataFrame形式加载内存中的时候会占用非常高的内存,这是因为pandas的处理机制默认会按照最大的规格去设置数据类型。
数据类型占用内存表格
-
常用的数据类型范围如下所示:
dtypes 范围下限(含) 范围上限(含)unit8 0 255unit16 0 65535int8 -128 127int16 -32768 32767int32 -2147483648 2147483647int64 –9,223,372,036,854,775,808 9,223,372,036,854,775,807
案例展示:
-
制造数据:
data = {'player1':[70,75,60,68]}data = pd.DataFrame(data)data player1 0 70 1 75 2 60 3 68
-
输出数据和他的数据类型:
for i in data['player1'].values: print(type(i))
解决方法:
def reduce_mem_usage(df, verbose=True): numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64'] # 计算当前占用的内存 start_mem = df.memory_usage(deep=True).sum() / 1024**2 # 循环每一列 for col in df.columns: # 获取每一列的数据类型 col_type = df[col].dtypes # 如果数据类型属于上面定义的类型之 if col_type in numerics: # 计算该列数据的最小值和最大值 用于我们指定相应的数据类型 c_min = df[col].min() c_max = df[col].max() # 如果 该列的数据类型属于 int 类型,然后进行判断 if str(col_type)[:3] == 'int': # 如果 该列最小的值 大于int8类型的最小值,并且最大值小于int8类型的最大值,则采用int8类型 if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max: df[col] = df[col].astype(np.int8) # 同上 elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max: df[col] = df[col].astype(np.int16) # 同上 elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max: df[col] = df[col].astype(np.int32) # 同上 elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max: df[col] = df[col].astype(np.int64) # 否则 则采用 float 的处理方法 else: if c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max: df[col] = df[col].astype(np.float32) else: df[col] = df[col].astype(np.float64) end_mem = df.memory_usage(deep=True).sum() / 1024**2 if verbose: print('Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction)'.format(end_mem, 100 * (start_mem - end_mem) / start_mem)) return df
转载地址:https://maoli.blog.csdn.net/article/details/115801785 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年04月17日 20时23分52秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Apache Kafka:优化部署的 10 种最佳实践
2019-05-01
Leetcode 35. 搜索插入位置 c#
2019-05-01
LeetCode62. 不同路径
2019-05-01
记gdb调试一次报错:Missing separate debuginfos, use: zypper install glibc-32bit-debuginfo-2.22-15.3.x86_64
2019-05-01
LeetCode242. 有效的字母异位词
2019-05-01
LeetCode83. 删除排序链表中的重复元素
2019-05-01
关于301和302重定向的理解
2019-05-01
使用java代码和jmeter脚本批量造数
2019-05-01
[9] JMeter-常用函数的使用
2019-05-01
[10] JMeter-察看结果树,你知道都有哪些功能吗?
2019-05-01
[11] JMeter-结果分析之聚合报告
2019-05-01
[12] JMeter-结果分析之图形图表
2019-05-01
[13] JMeter-详解JMeter参数化之CSV Data Set Config
2019-05-01
[14] JMeter关联-详解JMeter正则表达式提取器
2019-05-01
优化jmeter脚本
2019-05-01
Gradle基础使用总结1
2019-05-01
性能测试场景设置---不同场景下对应的jmeter脚本【不定时补充】
2019-05-01
登录oracle数据库时常用的操作命令整理
2019-05-01
微信小程序实现安卓机下拉不刷新,ios下拉刷新操作(自定义底部tab栏在安卓机下拉)
2019-05-01