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

如何加速C#或SQL中OFAC大规模数据集的比对?

大规模姓名数据集比对加速方案求助

需要快速比对两个大规模数据集:31000条左右的客户姓名,和OFAC的SDN列表(含主列表及别名列表,共约30000条),全量比对会产生超9亿条记录。目前用C#控制台程序的Parallel.ForEach循环估算耗时约10天,数据存储于MS SQL数据库,可选择本地或SQL Server处理。后续比对会跳过已完成记录,现寻求初始比对的加速方案。

当前控制台程序代码

List<CUSTOMER> CUSTOMERList = conn.CUSTOMERs.Take(1).ToList();

List<OFAC_Main> ofacMainList = conn.OFAC_Main.Include("OFAC_Alternate").Include("OFAC_Address").Include("Ofac_RemarkComment").ToList();

int minimumCharacterCount = Convert.ToInt32(Setting.SelectByName("MinimumCharacters").Value);

//loop through the CUSTOMER list
Parallel.ForEach(CUSTOMERList, CUSTOMER =>
{
    //find the values in the possible name fields in each CUSTOMER record
    List<string> CUSTOMERNames = GetNames(CUSTOMER);

    //loop through the names found in the CUSTOMER record
    Parallel.ForEach(CUSTOMERNames, CUSTOMERName =>
    {
        //if the CUSTOMER name is longer than the minimum character count setting, process it
        if (CUSTOMERName.Length > minimumCharacterCount)
        {
            //loop through the SDN list and process the name
            Parallel.ForEach(ofacMainList, ofacName =>
            {
                //convert List to json object
                //string ofacJson = JsonConvert.SerializeObject(ofacName);

                //if the SDN name is longer than the minimum character count setting, process it
                if (ofacName.SDN_Name.Length > minimumCharacterCount)
                {
                    Compare(CUSTOMERName.ToString(), ofacName.SDN_Name.ToString());
                }

                //if the SDN Name has Alternate names too, need to run the comparison against it too
                if (ofacName.OFAC_Alternate.Count > 0)
                {
                    foreach (OFAC_Alternate alternateName in ofacName.OFAC_Alternate)
                    {
                        //if the SDN Alternate name is longer than the minimum character count setting, process it
                        if (alternateName.Alt_Name.Length > minimumCharacterCount)
                        {
                            Compare(CUSTOMERName.ToString(), alternateName.Alt_Name.ToString());
                        }
                    }
                }
            });
        }
    });
});

加速优化方案

1. 移除过度并行,减少线程竞争

当前代码使用三重嵌套Parallel.ForEach,会导致大量线程上下文切换,反而拖慢效率。建议只在最外层(客户列表)设置并行,或者通过ParallelOptions限制最大并行度(比如等于CPU核心数),避免资源耗尽。

2. 预处理OFAC数据,缩小比对范围

  • 提前合并OFAC主姓名与别名,过滤掉长度不足minimumCharacterCount的条目,避免每次循环重复判断。
  • 对OFAC姓名构建分组索引(比如按首字母、姓名长度分组),这样比对时可以先匹配相同长度/首字母的条目,减少无效Compare调用。
  • 如果是模糊匹配,可使用布隆过滤器先快速排除完全不相关的姓名,大幅减少后续比对量。

3. 转移逻辑到数据库端处理

数据库的集合运算效率远高于客户端循环,可将比对逻辑移至SQL Server:

  • 将客户姓名和OFAC姓名导入临时表,使用CROSS JOIN结合长度过滤条件,再调用自定义CLR相似度函数筛选结果。
  • 分批读取客户数据,避免一次性加载31000条到内存,降低GC压力。

4. 优化Compare函数

  • 去掉不必要的字符串转换:CUSTOMERName.ToString()和ofacName.SDN_Name.ToString()如果本身是string类型,直接使用即可。
  • 若Compare是计算相似度(如编辑距离),优化算法实现,比如使用空间优化的动态规划版本,或缓存重复计算的结果。

5. 流水线式处理(TPL Dataflow)

使用TPL Dataflow构建多阶段流水线:

  1. 阶段1:分批加载客户数据
  2. 阶段2:提取客户姓名并过滤短名称
  3. 阶段3:与预处理的OFAC姓名比对
  4. 阶段4:保存比对结果
    这种方式能最大化CPU利用率,避免单阶段阻塞。

优化后示例代码

// 预处理OFAC数据:合并主姓名和别名,过滤短名称并去重
var ofacNames = conn.OFAC_Main
    .SelectMany(ofac => 
        new[] { ofac.SDN_Name }
        .Concat(ofac.OFAC_Alternate.Select(a => a.Alt_Name))
    )
    .Where(name => name.Length > minimumCharacterCount)
    .Distinct()
    .ToList();

int minimumCharacterCount = Convert.ToInt32(Setting.SelectByName("MinimumCharacters").Value);
// 设置合理的并行度,避免过度并行
var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount };

// 仅在客户列表层做并行,避免嵌套并行
Parallel.ForEach(conn.CUSTOMERs.AsEnumerable(), parallelOptions, customer =>
{
    // 提前过滤客户短名称
    var validCustomerNames = GetNames(customer)
        .Where(name => name.Length > minimumCharacterCount)
        .ToList();

    foreach (var customerName in validCustomerNames)
    {
        foreach (var ofacName in ofacNames)
        {
            Compare(customerName, ofacName);
        }
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:32:50