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
相关产品推荐
相关产品推荐

