找回密码
 会员注册
查看: 30|回复: 0

python读取大型csv文件,降低内存占用,提高程序处理速度

[复制链接]

2

主题

0

回帖

7

积分

新手上路

积分
7
发表于 2024-9-9 21:35:46 | 显示全部楼层 |阅读模式
文章目录简介读取前多少行读取属性列逐块读取整个文件总结参考资料简介遇到大型的csv文件时,pandas会把该文件全部加载进内存,从而导致程序运行速度变慢。本文提供了批量读取csv文件、读取属性列的方法,减轻内存占用情况。importpandasaspdinput_file='data.csv'123读取前多少行加载前100000行数据df=pd.read_csv(input_file,nrows=1e5)df12查看每个字段占用的系统内存的情况df.info(memory_usage='deep')1设置memory_usage的参数为‘deep’时,深度检查对象中的内存使用情况,包括对象中可能包含的其他对象(如列表、数组或其他数据结构)。若不设置deep参数,memory_usage只会返回一个对象的基础内存使用情况,这主要基于对象本身的内存占用,而不考虑它可能引用的其他对象。如上图所示,前100000行数据共占用220.MB内存。查看每列属性的内存占用情况;item=df.memory_usage(deep=True)1针对每个属性列的字节数进行求和,使用/(1024**2),实现1B到1MB的单位转换。验证了所有属性列的内存占用确实为220.8MB。内存占用从高到低降序排列:df.memory_usage(deep=True).sort_values(ascending=False)1读取属性列可能我们只关心,一整张表中的某几个属性,比如:'企业名称','经营范围'。那么便无需把整张表加载进内存。df2=pd.read_csv(input_file,nrows=1e5,usecols=['企业名称','经营范围'])1查看一下内存占用df2.memory_usage(deep=True).sum()/(1024**2)1只读取两个属性列,内存占用只有33MB。逐块读取整个文件pd.read_csv(input_file,chunksize=1e3,nrows=1e5)nrows=1e5:读取100000条数据;chunksize=1e3:每一块是1000条数据;故1e5条数据,应该由100块1e3的数据组成;#分批次读取,每chunksize是一个批次chunk_dfs=pd.read_csv(input_file,chunksize=1e3,nrows=1e5)v=0cnt=0#每个chunk_df都是dataframe类型数据forchunk_dfinchunk_dfs:print(chunk_df.shape)cnt+=1v+=chunk_df.shape[0]12345678910print(v,cnt)1上图验证了,总共处理了1e5条数据,分成了100块进行读取。总结pd.read_csv(input_file,nrows,usecols,chunksize)1nrows:读取多少行数据;usecols:读取哪些属性列的数据;chunksize:分块读取,每一块的大小是多少条数据;参考资料推荐|如何处理远超电脑内存的csv文件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-9 06:00 , Processed in 0.630061 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表