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
相关产品推荐
相关产品推荐

