R foreach %dopar% 结果
R foreach %dopar% Results
我正在尝试 运行 使用 foreach
和 %dopar%
的函数,它会在每次迭代时将其结果传回自身。下面的小例子:
require(doParallel)
test_function <- function(data)
{
result <- rbind(data, data)
return(result)
}
test_data <- mtcars
cl <- makeCluster(4)
registerDoParallel(cl)
results <- foreach(i = 1:10) %dopar%
{
aa <- test_function(test_data)
aa$iteration <- i
test_data <- aa
return(aa)
}
stopCluster(cl)
我希望在 results
中看到的是一个包含十个数据帧的列表,每个数据帧的行数依次加倍。
似乎在 foreach
函数中重新定义 test_data
并不能做到这一点,如果我只是 运行 在标准 for 循环中使用这些命令 - 就像这样:
results <- list()
for(i in 1:10)
{
aa <- test_function(test_data)
aa$iteration <- i
test_data <- aa
results[[i]] <- aa
}
希望能深入了解我在这里忽略的内容。
如果我对你的问题的理解正确,那么你的问题是因为你无法从并行化的 for 循环中更新全局变量 test_data
。
要了解为什么您无法这样做,请考虑并行化 for 循环中实际发生的情况:不同线程上的多个工作人员 运行 正在并行执行操作,每个操作都有自己独立的,局部范围的变量。如果他们可以访问任何全局变量(或共享内存)而没有任何类型的保护来控制对它的访问,那么就有可能破坏变量中存储的任何内容——并且有几种不同的方式可以发生这种破坏。
防止这种情况是 concurrency control structures like semaphores 存在的理由。这些允许用户做你想做的事,但需要小心才能正确使用。
但是,它们在 R 中不可用。因此,R 应该保护全局变量 test_data
不被以非 thread safe 方式修改是有道理的。它实际上是在尝试保护您的数据。
解决方案是重写您的代码以删除任何更新全局变量的尝试(如果您仍想进行任何类型的并行处理)或切换到使用传统的顺序 for 循环(正如一些评论者已经建议的那样) ).
我正在尝试 运行 使用 foreach
和 %dopar%
的函数,它会在每次迭代时将其结果传回自身。下面的小例子:
require(doParallel)
test_function <- function(data)
{
result <- rbind(data, data)
return(result)
}
test_data <- mtcars
cl <- makeCluster(4)
registerDoParallel(cl)
results <- foreach(i = 1:10) %dopar%
{
aa <- test_function(test_data)
aa$iteration <- i
test_data <- aa
return(aa)
}
stopCluster(cl)
我希望在 results
中看到的是一个包含十个数据帧的列表,每个数据帧的行数依次加倍。
似乎在 foreach
函数中重新定义 test_data
并不能做到这一点,如果我只是 运行 在标准 for 循环中使用这些命令 - 就像这样:
results <- list()
for(i in 1:10)
{
aa <- test_function(test_data)
aa$iteration <- i
test_data <- aa
results[[i]] <- aa
}
希望能深入了解我在这里忽略的内容。
如果我对你的问题的理解正确,那么你的问题是因为你无法从并行化的 for 循环中更新全局变量 test_data
。
要了解为什么您无法这样做,请考虑并行化 for 循环中实际发生的情况:不同线程上的多个工作人员 运行 正在并行执行操作,每个操作都有自己独立的,局部范围的变量。如果他们可以访问任何全局变量(或共享内存)而没有任何类型的保护来控制对它的访问,那么就有可能破坏变量中存储的任何内容——并且有几种不同的方式可以发生这种破坏。
防止这种情况是 concurrency control structures like semaphores 存在的理由。这些允许用户做你想做的事,但需要小心才能正确使用。
但是,它们在 R 中不可用。因此,R 应该保护全局变量 test_data
不被以非 thread safe 方式修改是有道理的。它实际上是在尝试保护您的数据。
解决方案是重写您的代码以删除任何更新全局变量的尝试(如果您仍想进行任何类型的并行处理)或切换到使用传统的顺序 for 循环(正如一些评论者已经建议的那样) ).