R- adist需要太长时间才能运行

时间:2015-12-16 09:06:43

标签: r performance levenshtein-distance

目前正在使用大约250k行的数据集.itils软件包的adist函数运行几个小时(8 +)

使用的代码:

master <- read.csv("Master.csv",header=TRUE)
companies <- read.csv("Clean Companies.csv",header=TRUE)
dirty<- subset(master,select=c("Company"))
comp<- subset(companies,select=c("COMPANY.CLEAN"))

dim(dirty)
> 246774 1

#To test one can use:
#dirty = data.frame(name= c("ABC","*/BC","HO**E...","OFFi....ce"))
#comp = data.frame(info_names= c("ABC","HOME","OFFICE"))    


mat <- adist(dirty1[, 1], comp[, 1]);
data<-cbind.data.frame(orig=dirty[, 1], new=comp[apply(mat, 1, which.min), 1])

有没有办法更好地做到这一点?

1 个答案:

答案 0 :(得分:1)

我不太了解adist功能,但您可以将其与例如foreach,如果dirty中的输入向量可以元素使用:(迭代器应该有助于减少内存使用)

library(foreach)
library(iterators)
mat_for <- foreach(dirti = iter(dirty$name), .export = "comp", .combine = rbind) %do% {
adist(dirti, comp[, 1])
}

您只需选择合适的并行后端并使用%dopar%

更改%do%

使用并行版本的lapply的其他并行方法(例如雪包中的parLapply)也应该有效:

mat_lap <- Reduce(rbind, lapply(dirty$name, function(x, comp) adist(x, comp[, 1]), comp= comp))

在一小部分数据上测试并行方法,然后您还可以查看计算时间是否减少。在您的示例中,我得到了相同的结果:

> all.equal(mat_lap, mat)
[1] TRUE
> all.equal(mat_for, mat)
[1] TRUE