【发布时间】:2015-11-03 07:24:01
【问题描述】:
require(plyr)
library(reshape)
library(iterators)
library(parallel)
library(foreach)
library(doParallel)
getCosine <- function(x,y)
{
this.cosine <- sum(x*y) / (sqrt(sum(x*x)) * sqrt(sum(y*y)))
return(this.cosine)
}
visitordata <- read.csv("~/Hotels.csv", sep = ",", header = TRUE , stringsAsFactors = FALSE )
visitordata <- subset(visitordata, Product.Views > 0)
head(visitordata)
Visitor_ID Products Product.Views
2 1001863689_3519696751 CZ1XQZ 2
3 1001863689_3519696751 CZR3CN 1
4 1001863689_3519696751 CZTNKN 3
5 121021834007_98749174 CZ2LB0 1
6 11029477426_678878300 CZTNKN 1
7 21029477426_678878300 CZVDHR 1
ColumnBasedData <- reshape(visitordata, idvar="Visitor_ID", timevar="Products", direction="wide")
ColumnBasedData[is.na(ColumnBasedData)] <- 0
x <<- (ColumnBasedData[,!(names(ColumnBasedData) %in% c("Visitor_ID"))])
head(x)
Product.Views.CZ1XQZ Product.Views.CZR3CN Product.Views.CZTNKN Product.Views.CZVDHR Product.Views.CZ36D3 Product.Views.CZE0EN
2 1 1 1 0 0 0
6 0 0 1 1 0 0
9 0 0 0 0 1 1
24 0 0 0 0 0 0
37 0 0 0 0 0 0
40 0 0 0 0 0 0
holder <- matrix(NA, nrow=ncol(x),ncol=ncol(x),dimnames=list(colnames(x),colnames(x)))
dataframe_y <<- as.data.frame(holder)
cl<-makeCluster(detectCores() -1)
doParallel::registerDoParallel(cl)
ls <- foreach(i = 1:ncol(x)) %dopar% {
for(j in 1:ncol(x)) {
dataframe_y[i,j] <- getCosine(x[i],x[j])
}
}
stopCluster(cl)
write.csv(dataframe_y,file="~/cosine.csv")
它适用于%do%,但不适用于%dopar%。对于 %dopar%,dataframe_y 返回 null。有什么想法吗?
编辑:库、函数、数据示例。 我将处理大数据,所以我尝试使用并行处理。脚本在没有并行处理的情况下需要一天多的时间才能完成。
【问题讨论】:
-
提供minimal reproducible example。你在用
parallel吗?getCosine是什么?x是什么? -
@m0nhawk 我编辑了这个问题。希望这个版本可以。感谢您的评论。
-
检查这个问题。如果它解决了您的问题,请告诉我们:stackoverflow.com/questions/33081342/…
-
另外,使用嵌套的
foreach:3。
标签: r foreach parallel-processing