You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

geopandas执行pd.concat拼接数据时报_ArrayMemoryError内存分配失败问题

问题核心原因

  • 列对齐异常导致类型膨胀:你调整数据时删除列的操作没有保证4个待拼接数据集的列完全一致,pd.concat默认采用outer join逻辑,缺失列会自动补NaN,导致原本的数值、几何等原生类型列被强制转换为内存占用高5~10倍的object类型,你提到的报错维度第一个参数57刚好和你最终保留的列数一致,就是这个原因导致的。
  • 内存碎片化导致分配失败:你当天反复运行数据处理代码,大量中间GeoDataFrame对象没有被及时回收,16GB内存的空闲空间被切割成多块不连续的小区域,即使总空闲内存足够,也无法分配numpy要求的连续大数组,因此会出现报错申请的内存大小随机波动的情况。
  • 去重逻辑的临时内存开销过大:链式调用concat+drop_duplicates时,pandas需要同时持有拼接后的全量数据、去重计算的临时数组两份内存副本,进一步放大了内存压力。

解决方案

第一步:先校验并对齐待拼接表的列

执行以下代码确认列差异,避免concat自动生成多余列:

# 检查所有待拼接表的列差异
col_sets = [set(df.columns) for df in [parcels2021, parcels2017, parcels2006_merged, parcels2010_merged]]
common_cols = set.intersection(*col_sets)
diff_cols = set.union(*col_sets) - common_cols
print(f"共有列数:{len(common_cols)},各表差异列:{diff_cols}")

如果存在差异列,要么统一删除所有表的非共有列,要么给缺失列的表提前补对应类型的空值,concat时指定join='inner'仅拼接共有列:

temp = pd.concat(
    [parcels2021, parcels2017, parcels2006_merged, parcels2010_merged],
    ignore_index=True,
    join='inner' # 仅保留所有表共有的列,避免自动补空转object
)

第二步:优化去重逻辑降低内存开销

不要全表执行drop_duplicates,仅通过去重字段筛选索引,大幅降低临时内存占用:

import gc
# 仅提取去重字段获取唯一行的索引
unique_idx = temp['PARCEL_SPI'].drop_duplicates(keep='first').index
spine = temp.loc[unique_idx].reset_index(drop=True)
# 及时删除临时变量回收内存
del temp
gc.collect()

第三步:提前清理内存碎片

如果是在Jupyter等交互式环境运行,先删除所有不需要的中间变量,执行垃圾回收后再运行拼接代码,必要时直接重启内核清空残留内存占用。
如果后续还需要优化,可将字符串列转为pandas专属StringDtype,数值列转为Int64/Float64可空类型,几何列启用pygeos后端存储,进一步降低数据集内存占用。

内容的提问来源于stack exchange,提问作者lev72748

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:24:05