В Revolution R 2.12.2 в Windows 7 и Ubuntu 64-bit 11.04 у меня есть фрейм данных с более чем 100K строк и более 100 столбцов, и я получаю ~ 5 столбцов (sqrt, log, log10 и т. Д.) Для каждого изисходные столбцы и добавьте их в тот же фрейм данных.Без параллелизма с использованием foreach и% do% это работает нормально, но медленно.Когда я пытаюсь распараллелить его с foreach и% dopar%, он не будет обращаться к глобальной среде (чтобы предотвратить состояние гонки или что-то в этом роде), поэтому я не могу изменить фрейм данных, потому что объект фрейма данных «не найден».
Мой вопрос как я могу сделать это быстрее ?Другими словами, как распараллелить либо столбцы, либо преобразования?
Упрощенный пример:
require(foreach)
require(doSMP)
w <- startWorkers()
registerDoSMP(w)
transform_features <- function()
{
cols<-c(1,2,3,4) # in my real code I select certain columns (not all)
foreach(thiscol=cols, mydata) %dopar% {
name <- names(mydata)[thiscol]
print(paste('transforming variable ', name))
mydata[,paste(name, 'sqrt', sep='_')] <<- sqrt(mydata[,thiscol])
mydata[,paste(name, 'log', sep='_')] <<- log(mydata[,thiscol])
}
}
n<-10 # I often have 100K-1M rows
mydata <- data.frame(
a=runif(n,1,100),
b=runif(n,1,100),
c=runif(n,1,100),
d=runif(n,1,100)
)
ncol(mydata) # 4 columns
transform_features()
ncol(mydata) # if it works, there should be 8
Обратите внимание, что если вы измените% dopar% на% do%, он будет работать нормально