pandas可通过分块处理、类型优化、query/eval加速及接入dask/polars等策略高效处理gb级数据。关键在于分治、延迟计算与资源协同,而非硬扛超大规模数据。

处理大数据时,Pandas 本身不是为超大规模数据设计的,但通过合理策略,它仍可高效应对 GB 级别、甚至接近单机内存上限的数据任务。关键不在于“硬扛”,而在于分治、延迟计算和资源协同。
用 chunksize 分块读取与处理
直接 pd.read_csv() 加载几十 GB 文件极易触发 MemoryError。改用分块流式处理,边读边算,不全量驻留内存:
- 设置
chunksize=50000(根据行宽和可用内存调整),返回可迭代的TextFileReader - 对每块做过滤、聚合或转换,再用
pd.concat()合并结果(仅合并最终需要的部分,避免拼回完整 DataFrame) - 示例:统计某列出现频次,可对每块调用
value_counts(),再用sum()合并各块结果
优先使用 category 和 nullable dtypes
字符串列和缺失值是内存大户。优化类型能立竿见影:
感谢您选择使用ERMEB域名授权离线网络验证系统(简称:ERMEB域名授权系统)是ERMEB团队开发,ERMEB域名授权系统是国内最稳定,最强大,最先进的域名授权管理平台解决方案之一,ERMEB域名授权系统采用PHP +Mysql的技术,ERMEB域名授权系统框架使用Thinkphp6/mysql数据库基于Markdown开发者文档开发而成,项目安装请参考ThinkPHP官方文档及下面的服务环境说
- 对低基数文本列(如状态、城市名),转为
'category'类型,内存常降 5–10 倍 - 用
Int64、boolean等可空整数/布尔类型替代float64或object存缺失整数/布尔,更省内存且语义清晰 - 读取时用
dtype参数预设类型,或用df.astype()批量转换,避免后期推断开销
用 query() 和 eval() 替代布尔索引
对大 DataFrame 做条件筛选或计算时,字符串表达式比 Python 表达式更快更省内存:
立即学习“Python免费学习笔记(深入)”;
-
df.query('age > 30 and city == "Beijing"')比df[(df.age > 30) & (df.city == "Beijing")]更快,且支持局部变量(@var) -
df.eval('income_after_tax = income * (1 - tax_rate)')比df['income_after_tax'] = df.income * (1 - df.tax_rate)占用更少临时内存 - 注意:确保表达式中列名不含空格或特殊字符,否则需用反引号包裹,如
`user id`
必要时接入 Dask 或 Polars
当 Pandas 优化已达瓶颈(如需跨核并行、外存计算或极宽表操作),应主动切换工具链:
-
Dask DataFrame 接口高度兼容 Pandas,自动并行化 + 延迟执行,适合单机多核或小集群,支持
read_csv直接读大文件 - Polars 是 Rust 编写的高性能 DataFrame 库,内存效率与速度常优于 Pandas,尤其擅长过滤、分组和窗口计算;Python 接口简洁,可作为 Pandas 的轻量级替代
- 不建议强行用 Pandas “硬刚” TB 级数据——该换工具时就换,而非堆参数









