read_csv读取CSV文件内存占用与原文件大小不一致问题咨询
问题原因分析
核心差异来自pandas对不同字段类型的内存占用逻辑
CSV是纯文本存储格式,所有内容都以字符形式存储,仅占用字符本身的字节数;而pandas数据框加载到内存后,会根据数据类型采用对应的二进制存储规则,不同类型的内存开销差异极大。
- 第一个案例(ua_df内存远大于文件)的原因:
你提供的样例里classification、years、Gender三个字段都是字符串类内容,其中years带前导零不会被pandas默认识别为数值,所以pandas默认会将这三个字段都推断为object类型。object类型的每个元素都是独立的Python字符串对象,除了字符串本身的内容,还要额外存储Python对象的元数据开销,单条字符串的内存占用是文本存储的十几到几十倍,数据量大的情况下总内存就会远高于原CSV文件大小。 - 第二个案例(内存和文件大小接近)的原因:
该表的三个字段都是数值类型(ID、shopCD为整数,distance为浮点数),pandas会自动推断为int64/float64等数值类型,这类类型的内存占用是固定的,且数值的文本存储长度和二进制存储的字节数差异很小,所以最终总内存占用和原CSV文件大小基本一致。
验证方法
你可以运行以下代码确认各字段的内存占用:
# 查看各字段数据类型 print(ua_df.dtypes) # 查看各字段实际内存占用(deep=True才能统计object类型的真实占用) print(ua_df.memory_usage(deep=True))
优化方案
要降低第一个表的内存占用,可以在读取CSV的时候手动指定字段类型:
import pandas as pd ua_df = pd.read_csv( "你的文件路径.csv", dtype={ "classification": "category", # 重复值多的分类字段用category,内存可压缩90%+ "years": "category", # 如果需要保留前导零就用category,不需要可以转成int类型 "Gender": "category", "ID": "int32" # 按需选择更小的数值类型,比如int32比默认int64省一半空间 } )
调整类型后你再统计内存占用,基本就会和原文件大小接近甚至更小。
内容的提问来源于stack exchange,提问作者lazy
相关产品推荐
相关产品推荐

