使用foreach包,我期待以下行在大约10秒内运行
system.time(foreach (i=1:5, .combine='c') %do% {Sys.sleep(2);i})
user system elapsed
0.053 0.011 10.012
Run Code Online (Sandbox Code Playgroud)
并且以下行在大约2秒内运行
system.time(foreach (i=1:5, .combine='c') %dopar% {Sys.sleep(2);i})
user system elapsed
0.069 0.017 10.019
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
我在Mac OSX上,我的机器有16个处理器,目前没有任何重量.我没有收到任何错误或警告信息.
我有这个:
Parallel.ForEach(numbers, (number) =>
{
var value = Regex.Replace(number, @"\s+", "%20");
tasks.Add(client.GetAsync(url + value));
});
await Task.WhenAll(tasks).ConfigureAwait(false);
foreach (var task in tasks)
{
...
}
Run Code Online (Sandbox Code Playgroud)
有时在到达 foreach(任务中的 var 任务)时返回较少的任务,但在几次请求后,开始返回所有任务。
我已将 ConfigureAwait 更改为 true,但有时仍会返回较少的任务。
顺便说一句,我使用 Parallel.ForEach,因为每个 client.GetAsync(url + value) 都是对外部 api 的请求,其特殊性在于其 99% 的请求的延迟 SLA 低于 1s
你们能解释一下为什么它有时会返回较少的任务吗?
有没有办法保证总是返回所有任务?
谢谢
我在for循环中调用一个函数.
sample_fun <- function(x,y) {
# do something with x,y and return value
}
My loop looks like
result = list()
for(i in 1:10000)
result[i] = sample_fun(i,i+1)
Run Code Online (Sandbox Code Playgroud)
我如何并行化这个循环.使用foreach和dopar给出了下标错误.
考虑使用并行foreach生成随机值的非常基本(且效率低下)的代码:
cl <- makeCluster(2)
registerDoParallel(cl)
foreach(i = 1:100) %dopar% rnorm(1)
Run Code Online (Sandbox Code Playgroud)
它是正确的还是随机生成正常工作需要任何额外的步骤?我想这已经足够了,快速检查似乎“证明”了种子工作正常,但我想确定它在其他平台上也是如此,因为我希望代码是可移植的。
我试图通过使用 doParallel 包和 foreach 包来让我的代码在 R 上并行运行。我还使用 sf 包来操作 shp 文件。我确保所有代码都在 foreach 循环中使用 %do% 工作,因此如果出现错误,我可以更好地追踪它。我的代码使用 foreach 和 %do% 工作得很好,但是当我更改它时 do%dopar% R 会继续给我以下错误:
{ 中的错误:任务 1 失败 - “找不到函数“st_geometry_type””
尽管我在 R 脚本的顶部明确使用了 require(sf) 。我制作了一个小函数,如果语句为真,则仅打印“检查”以复制错误。
require(sf)
require(doParallel)
doParallel::registerDoParallel(cores = 2)
testforeach <- function(sfObject)
{
foreach(i=1:10) %dopar% {
if (st_geometry_type(sfObject[i,]) == "LINESTRING")
{
print("check")
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行这段代码时,它会抛出同样的错误:
{ 中的错误:任务 1 失败 - “找不到函数“st_geometry_type””
但是,当我用 %do% 替换 %dopar% 时,它会打印出所有预期的“检查”消息。这是 R 中的错误还是我遗漏了什么?我尝试重新安装我的软件包,但这似乎没有任何影响,因为我继续遇到相同的错误。任何帮助将不胜感激。