如何在使用foreach的并行处理中使用共享数据框
how to use shared dataframe in parallel processing using foreach
我想使用 foreach 包来并行 for 循环:
原始代码如下:
data_df=data.frame(...) # the data frame where original data stored
result_df=data.frame(...) # the data frame where result data to be stored
for(i in 1:10)
{
a=data_df[i,]$a
b=data_df[i,]$b
sum_result=a+b
sub_result=a-b
result_df[i,]$sum_result=sum_result
result_df[i,]$sub_result=sub_result
}
我使用索引 i 作为行号,从数据帧中获取数据并将数据存储回另一个数据帧。
但是,如果我改变:
for(i in 1:10)
到
foreach( i=1:10) %dopar%
它 运行 超级快,但结果似乎只存储在数据框中的一列中。如何将两列保存在一起?
共享数据框应该怎么写才能并行?
data_df
的示例数据
a b
1 1
2 4
4 8
9 6
2 3
你应该使用.combine = rbind
result = foreach(i = 1:5, .combine = rbind) %dopar% {
data.frame(x = runif(40), i = i)
}
> head(result)
x i
1 0.2777559 1
2 0.2126995 1
3 0.2847905 1
4 0.8950941 1
5 0.4462353 1
6 0.7799849 1
你可以这样做:
require("doParallel")
require("foreach")
registerDoParallel(cores=detectCores())
n <- nrow(data_df)
res <- foreach(i=1:n, .combine=rbind) %dopar% {
data_df[i,]$a + data_df[i,]$b
}
data_df
# a b
# 1 1 6
# 2 2 7
# 3 3 8
# 4 4 9
# 5 5 10
res
# [,1]
# result.1 7
# result.2 9
# result.3 11
# result.4 13
# result.5 15
数据
data_df <- structure(list(a = 1:5, b = 6:10), .Names = c("a", "b"), row.names = c(NA,
-5L), class = "data.frame")
我想使用 foreach 包来并行 for 循环:
原始代码如下:
data_df=data.frame(...) # the data frame where original data stored
result_df=data.frame(...) # the data frame where result data to be stored
for(i in 1:10)
{
a=data_df[i,]$a
b=data_df[i,]$b
sum_result=a+b
sub_result=a-b
result_df[i,]$sum_result=sum_result
result_df[i,]$sub_result=sub_result
}
我使用索引 i 作为行号,从数据帧中获取数据并将数据存储回另一个数据帧。
但是,如果我改变:
for(i in 1:10)
到
foreach( i=1:10) %dopar%
它 运行 超级快,但结果似乎只存储在数据框中的一列中。如何将两列保存在一起?
共享数据框应该怎么写才能并行?
data_df
的示例数据a b
1 1
2 4
4 8
9 6
2 3
你应该使用.combine = rbind
result = foreach(i = 1:5, .combine = rbind) %dopar% {
data.frame(x = runif(40), i = i)
}
> head(result)
x i
1 0.2777559 1
2 0.2126995 1
3 0.2847905 1
4 0.8950941 1
5 0.4462353 1
6 0.7799849 1
你可以这样做:
require("doParallel")
require("foreach")
registerDoParallel(cores=detectCores())
n <- nrow(data_df)
res <- foreach(i=1:n, .combine=rbind) %dopar% {
data_df[i,]$a + data_df[i,]$b
}
data_df
# a b
# 1 1 6
# 2 2 7
# 3 3 8
# 4 4 9
# 5 5 10
res
# [,1]
# result.1 7
# result.2 9
# result.3 11
# result.4 13
# result.5 15
数据
data_df <- structure(list(a = 1:5, b = 6:10), .Names = c("a", "b"), row.names = c(NA,
-5L), class = "data.frame")