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

使用Python Record Linkage Toolkit对大型数据集去重的内存优化方案

单数据集去重内存不足解决方案

方案1:手动分块迭代(无需额外依赖,易上手)

这个方案不需要引入新工具,直接改造官方双数据集关联逻辑适配单数据集去重场景,全程不会生成全量数十亿条的multi index,普通16G内存即可跑通7.5万条数据集的全索引去重:

  1. 把原始数据集拆分为N个等大的小数据块,块大小根据内存调整,7.5万条数据拆成10块的话单块只有7500条,单块全配对仅2800万条,完全在内存承载范围内
  2. 先逐个处理单个块内部的去重,跑完就释放当前块的索引内存
  3. 再迭代处理i<j的块组合,每次仅生成两个块的跨库配对,避免重复计算也不会生成全量索引
  4. 最后合并所有匹配结果即可

参考代码:

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托管分块和内存调度,不用手动写循环逻辑:

  1. 用dask.dataframe.read_csv读取原始数据,设置合适的分区大小
  2. 用map_partitions方法对每个分区运行块内去重逻辑
  3. 用Dask的笛卡尔积方法生成分区两两组合,逐个运行跨分区匹配逻辑
  4. 最后调用compute方法合并所有结果即可,Dask会自动处理内存调度,不会一次性加载全量数据

刚接触Python的话建议先跑通方案1验证逻辑,再尝试Dask方案降低出错概率。

额外优化建议

  • 可以添加弱阻塞规则缩小配对范围,比如按字段前缀、所属区域等低区分度字段做block,只要规则设置合理不会漏匹配,同时能把配对数降低1-2个数量级
  • 分块数量可以根据工作站内存自由调整,内存越小分块数设置越大即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:57:01