使用Python Record Linkage Toolkit对大型数据集去重的内存优化方案
单数据集去重内存不足解决方案
方案1:手动分块迭代(无需额外依赖,易上手)
这个方案不需要引入新工具,直接改造官方双数据集关联逻辑适配单数据集去重场景,全程不会生成全量数十亿条的multi index,普通16G内存即可跑通7.5万条数据集的全索引去重:
- 把原始数据集拆分为N个等大的小数据块,块大小根据内存调整,7.5万条数据拆成10块的话单块只有7500条,单块全配对仅2800万条,完全在内存承载范围内
- 先逐个处理单个块内部的去重,跑完就释放当前块的索引内存
- 再迭代处理
i<j的块组合,每次仅生成两个块的跨库配对,避免重复计算也不会生成全量索引 - 最后合并所有匹配结果即可
参考代码:
import recordlinkage import numpy as np import pandas as pd # 替换为你自己的数据集读取逻辑,确保df有唯一的行索引 df = pd.read_csv("your_deduplication_dataset.csv") n_chunks = 10 # 内存不够可以调大这个值,拆分更多小块 chunks = np.array_split(df, n_chunks) all_matches = [] # 处理单个块内部的去重 for chunk in chunks: indexer = recordlinkage.Index() indexer.full() current_pairs = indexer.index(chunk) # 替换为你自己的字段比较规则 compare = recordlinkage.Compare() compare.string("company_name", "company_name", method="levenshtein", threshold=0.7, label="name_sim") compare.exact("register_city", "register_city", label="city_match") features = compare.compute(current_pairs, chunk) # 替换为你自己的匹配阈值规则 valid_matches = features[features.sum(axis=1) >= 1.5].reset_index() all_matches.append(valid_matches) # 处理块与块之间的配对去重,i<j避免重复计算同一对块 for i in range(n_chunks): for j in range(i+1, n_chunks): chunk_a = chunks[i] chunk_b = chunks[j] indexer = recordlinkage.Index() indexer.full() current_pairs = indexer.index(chunk_a, chunk_b) # 复用上面的字段比较规则即可 compare = recordlinkage.Compare() compare.string("company_name", "company_name", method="levenshtein", threshold=0.7, label="name_sim") compare.exact("register_city", "register_city", label="city_match") features = compare.compute(current_pairs, chunk_a, chunk_b) valid_matches = features[features.sum(axis=1) >= 1.5].reset_index() all_matches.append(valid_matches) # 合并所有匹配结果,可根据需要再做一轮去重避免重复配对 final_matches = pd.concat(all_matches, ignore_index=True)
方案2:Dask适配方案(适合更大规模数据)
如果后续数据量继续增大,可以用Dask托管分块和内存调度,不用手动写循环逻辑:
- 用
dask.dataframe.read_csv读取原始数据,设置合适的分区大小 - 用
map_partitions方法对每个分区运行块内去重逻辑 - 用Dask的笛卡尔积方法生成分区两两组合,逐个运行跨分区匹配逻辑
- 最后调用
compute方法合并所有结果即可,Dask会自动处理内存调度,不会一次性加载全量数据
刚接触Python的话建议先跑通方案1验证逻辑,再尝试Dask方案降低出错概率。
额外优化建议
- 可以添加弱阻塞规则缩小配对范围,比如按字段前缀、所属区域等低区分度字段做block,只要规则设置合理不会漏匹配,同时能把配对数降低1-2个数量级
- 分块数量可以根据工作站内存自由调整,内存越小分块数设置越大即可
内容的提问来源于stack exchange,提问作者misterducky
相关产品推荐
相关产品推荐

