Python模糊匹配脚本遇zsh: killed错误的解决办法
解决Python模糊匹配进程被终止的问题
错误原因
zsh: killed 本质是系统因内存不足强制终止了Python进程。你的代码中使用indexer.full()会生成两个数据集的全笛卡尔积候选对——若al_usa和al_sample的行数分别为M和N,候选对数量就是M*N,数据量稍大就会直接耗尽内存。
修复方案
1. 替换全索引为高效索引策略
放弃full(),改用内存友好的索引方式:
- 块索引(Block Index):按共同字段分组,仅在同组内生成候选对,比如按
state字段:
indexer = recordlinkage.Index() indexer.block('state') # 仅匹配同州的记录
- 排序邻域索引:对指定字段排序后,仅匹配相邻范围内的记录,适合文本类字段(如公司名):
indexer = recordlinkage.Index() indexer.sortedneighbourhood('companyname', window=5) # 窗口大小可按需调整
2. 预处理数据缩小规模
- 加载数据时仅保留必需字段:
# 只加载匹配需要的列 al_usa = pd.read_csv('al_all_reference_usa.dta.csv', index_col='id', usecols=['id', 'companyname', 'state']) al_sample = pd.read_csv('al_final.dta.csv', index_col='company_number', low_memory=False, usecols=['company_number', 'name', 'state'])
- 去除重复记录:
al_usa = al_usa.drop_duplicates(subset=['companyname', 'state']) al_sample = al_sample.drop_duplicates(subset=['name', 'state'])
3. 临时提升系统可用内存
如果是Mac系统,可关闭其他高内存占用应用,或通过终端调整内存限制(效果有限):
ulimit -S -s unlimited
4. 分批次处理超大数据集
若数据量极大,可将数据集拆分后分批处理,最后合并结果:
# 示例:按state字段拆分,逐个处理子数据集 for state in al_sample['state'].unique(): sample_subset = al_sample[al_sample['state'] == state] usa_subset = al_usa[al_usa['state'] == state] indexer = recordlinkage.Index() indexer.block('state') candidates = indexer.index(usa_subset, sample_subset) features = compare.compute(candidates, usa_subset, sample_subset) # 保存当前批次结果 features.to_csv(f'match_features_{state}.csv')
验证修改
替换索引策略后,先打印候选对数量:
print(len(candidates))
若候选对数量远小于全笛卡尔积规模,说明内存压力已缓解,后续匹配计算可正常运行。
内容的提问来源于stack exchange,提问作者econ_grad12345
相关产品推荐
相关产品推荐

