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

R中大规模data.table子串提取与比较的性能优化求助

子串高效比较的性能优化需求

我处理数据集时遇到子串高效比较的性能难题,即便使用高性能硬件,现有方案的运行速度仍无法满足需求。我拥有一个包含2列、约15亿行的data.table,结构如下:

library(data.table)
library(stringr)
library(stringi)
library(stringdist)

dt <- data.frame(c("002134", "024345", "176234"), c("002003", "024234", "002004"))
colnames(dt) <- c("class1", "class2")
setDT(dt)

需要实现以下功能:

  • 提取每行两个字符串的前3位子串
  • 比较两个子串是否相等
  • 生成布尔变量sameclass标记比较结果,预期输出如下:
dt$sameclass <- c(TRUE, TRUE, FALSE)
print(dt)
   class1 class2 sameclass
1: 002134 002003      TRUE
2: 024345 024234      TRUE
3: 176234 002004     FALSE

我尝试了stringr、stringi结合stringdist的多种实现方式(包括在data.table内外的写法),但子串提取环节仍是性能瓶颈,所有方案要么出现内存不足问题,要么需要数小时甚至一天才能运行完成。由于需要重复执行该操作,寻求更快速、高效的实现方案。


编辑补充:基准测试结果

我已对部分建议方案进行基准测试,结果显示性能有显著提升:

dt <- data.frame(rep(c("002134", "024345", "176234"), 1000), rep(c("002003", "024234", "002004"), 1000))
colnames(dt) <- c("class1", "class2")
setDT(dt)

times <- microbenchmark(

startswithtest = dt[, startsWith(class2, substring(class1, 1, 3))],
lapplytest = dt[, do.call(`==`, lapply(.SD, substring, 1, 3)), .SDcols = c("class1", "class2")],
numerictest = dt[, as.numeric(class1)%/%1000 == as.numeric(class2)%/%1000],
functiontest = dt[, sameclass(subclass1 = class1, subclass2 = class2, classdepth = 3), by = seq_len(nrow(dt))],
stringitest = dt[, stringdist(a = stri_sub(dt$class1, to = 3), b = stri_sub(dt$class2, to = 3), method = "hamming")], 
times = 50
)
times
           expr       min        lq       mean     median         uq        max neval
 startswithtest   312.501   356.901   593.4530   444.8515    737.301   1692.602    50
     lapplytest   383.602   439.201   736.3512   522.7010    966.901   2259.601    50
    numerictest  1763.100  1932.600  3229.6651  2399.7510   4153.201   8396.301    50
   functiontest 45677.700 61124.002 81567.9409 77844.5510 100084.901 133921.502    50
    stringitest   794.201  1028.200  1423.5289  1259.6005   1739.400   3640.701    50

由于服务器限制无法使用C函数,目前我将选用startswith方案,感谢大家的帮助!


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:49:54