2015-12-16 259 views
0

目前正與約25萬的數據集工作rows.The的utils的包adist功能數小時(8個)R- adist花費太長時間運行

代碼中運行:

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]) 

有沒有辦法做得更好?

+0

據我所知'adist'從utils軟件包。你知道這個計算的距離有多少? – Roland

+0

一個10GB +矩陣。 n×m矩陣,n = nrow(髒),m = nrow(comp) – user3243478

+0

那麼,你有它。所以,你可能有超過10萬億次的比較。你最好的選擇可能確實是並行化。 – Roland

回答

1

我不太瞭解adist功能,但您可以使用例如parallize它。的foreach,如果髒輸入向量可以用來元素方式:(迭代器應該有助於減少內存使用)

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

你只需要選擇一個合適的並行後端和更改%做到%和%dopar%

使用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