问题标签 [r-future]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - R闪亮+未来+水管工
前言
受到 Barret Schloerke 在 studio::global(2021) 上的演讲的启发(我会在链接可用时立即添加),我尝试实现一个应用程序来查看使用{future
}、{plumber}
、 两者或都不使用 Shiny之间的区别应用程序运行一系列快速 - 慢 - 慢 - 快计算(在不同的输出上和在同一输出中的序列中)。
要旨
你可以在这里找到我的尝试,包括app.R
Shiny 应用程序和plumber.R
API。
结果
选择执行(“慢”为 5 秒) | 结果 | 期待 | 注释 |
---|---|---|---|
标准运行 | 在任何事物出现前约 20 秒,接下来的一切都在同一时刻出现 | ~20 秒,以某种方式依次出现 | 为什么没有顺序出现? |
{future} 只要 |
在任何事物出现前约 5 秒,接下来的一切都在同一时刻出现 | ~20 几乎立即出现“第一个快速”和“第二个快速”,接下来(~5)“第一个慢”或“第二个慢”,下一个(~10)另一个,最后(~20)“顺序”) | 我希望这类似于这里发生的组合类型的运行......“顺序”怎么可能在 5 秒内完成? |
{plumber} 只要 |
与标准运行相同(在解决每个 API 调用之前,r 应该保持忙碌,对吗?) | 同时(~20),但按顺序出现 | 为什么闪亮同时渲染所有东西? |
{future} 和{plumber} |
与标准运行相同 | 我根本没想到这一点!,我在这里期望的是“ _fast”立即出现,“ _slow”在大约 5 秒后的同一时间出现,“连续”在开始后大约 10 秒后出现(即,总共约 10 秒) | 我在这里完全困惑:-( |
怀疑
我不明白的主要事情之一是为什么在激活时{future}
(无论有或没有{plumber}
),“第一次快速”不会立即出现。而且一般来说,为什么输出不出现在一个序列中时{future}
不涉及。怎么可能{future}
单独“连续”停留约 5 秒?
所以,很明显,我做错了一些事情,我没有正确理解一些事情。
问题
有人可以帮助我了解我在哪里/什么(并可能尝试推断“为什么”)我让应用程序错误,和/或 API 错误,或者他们的交互错误?
谢谢你,科拉多。
r - 使用“未来”进行并行化的速度增益不佳
我发现使用future
(and furrr
) 包进行并行化的速度增益R
并不令人满意。尤其是速度提升并不接近线性。我的机器有 4 个工人,所以我认为当我指定的工人数量不大于我机器中可用的核心数量时,速度增益应该是线性的。然而,事实并非如此。
下面是一个说明问题的例子,我画了 10^7 个随机数 500 次。
在上面的例子中,我得到的速度增益是:
- 2 名工人 1.87 倍
- 3 名工人的 2.62 倍
- 4 名工人的 3.17 倍
上例中的速度增益并不接近线性,尤其是当我使用 4 个工人时。我认为这可能是因为plan
函数的开销时间。但是,如果我在设置工人数量后多次运行该过程,则速度增益是相似的。这说明如下:
我还尝试使用包中的future_lapply
函数future.apply
而不是包中的future_map
函数furrr
。但是,它们的速度增益也相似。因此,我将不胜感激任何关于这里发生的事情的建议。谢谢!
r - 在 future.apply::future_lapply 中使用 tryCatch 处理异常
我想重新尝试readLines
使用tryCatch
. 只要我不将其包装在future.apply::future_lapply
处理列表或向量的调用中,这将按预期工作。
可以使用以下代码重现该问题:
当然,代码是用来重试暂时readLines
失败的,而示例 URL 总是会失败,但这种方式最容易看出问题。使用lapply
代替 时future.apply::future_lapply
,至少需要 5 秒才能完成,因为它在 5 次尝试后等待 5 秒。情况并非如此future.apply::future_lapply
,表明异常处理不起作用。
我做错了什么,我怎么能tryCatch
在里面工作future.apply::future_lapply
?
r - 如何在德雷克/目标管道中使用 rgrass7 从 R 运行并行 GRASS GIS 地图集?
我想使用目标管道中的包 rgrass7 并行化我的 GRASS GIS 分析和计算。由于我是 GRASS 的新手,我不确定如何在同一个 GRASSGIS 数据库中正确设置多个地图集。到目前为止,我尝试了以下代码:
由reprex 包于 2021-03-16 创建(v0.3.0)
我正在使用 rgrass7_0.2-5 和独立的 winGRASS 7.8.5-2 都安装在默认目录中
我真的很感激一些关于如何做到这一点的提示!
r - R中的中止后台进程/未来
我需要监控脚本的 RAM 使用情况A
。由于我还需要收集额外的数据,我想在 A 本身中这样做。
我的计划是执行以下操作:
但是,monitor
当标志设置为 false 时不会停止执行。根据文档,这种行为似乎是预期的情况:https ://cran.r-project.org/web/packages/future/vignettes/future-1-overview.html (全局部分)。尽管如此,我仍然可以使这种方法以某种方式工作(也许强制重新加载全局变量?!)还是有另一种更适合我可以使用的包/方法?
r - 等待未来在 Shiny 中结合进度条完成
我在 R 中有一个很长的任务,它会进行大量计算并写出几个文件。这个函数是从 Shiny-reactive 中调用的。由于这需要很长时间,我想在多个进程上并行化它,但同时我想为最终用户包含一个进度条。我密切关注这篇文章的答案,它使用futures
:在并行 foreach 计算中使用标准 R 闪亮进度条。
但是:我的函数创建的文件稍后用于在另一个反应式中进行一些进一步的处理。不知何故,我无法让第二次反应等待,直到我的未来完全完成 - 它已经尝试读取尚未存在或不完整的文件。我如何告诉第二个反应者等到未来完成?
到目前为止我的代码:
我想要实现的最重要的事情是:
- 并行化耗时的计算
- 为最终用户提供进度条
- 在继续下一步之前全面评估承诺
我的错误在哪里/在哪里?
r - terra 包在尝试运行并行操作时返回错误
我正在使用raster
包,我尝试切换到,terra
但由于某些我不明白的原因,terra
无法重现raster
与包等并行工作时的相同操作snowfall
和future.apply
. 这是一个可重现的例子。
.External(list(name = "CppMethod__invoke_notvoid", address = <pointer: (nil)>, : NULL 值作为符号地址) 中的错误。
rast
如果我更改withraster
和terra::mask
with ,完全相同的代码效果很好raster::mask
。见下文:
如果我使用snowfall
而不是相同的行为future
这会返回相同的错误,future_lapply
为什么会发生这种情况?我从未见过这样的错误。我希望利用更高的速度,terra
但所以我被卡住了。
r - 在 R/Shiny 中获取、等待语法?
在 R/Shiny 中,我们可以使用 library(promises) 和 library(future) 来异步处理事件。但我似乎无法找到一种方法将它与 library(httr) 结合起来做类似于fetch/await/async的事情,从而设置一个 promise,当 httr 请求成功时解决。是否可以在 R/Shiny 中设置一个在 httr 请求成功时解决的承诺?或者您只能执行以下操作,首先检查是否会出现 http 错误?
r - 我可以使用 R {targets} 包为不同的目标设置不同的并行度吗?
我正在测试这个targets
包并且在自定义并行化方面遇到了问题。我的工作流程有两个步骤,我想将第一步并行化超过 4 个工作人员,第二步并行化超过 16 个工作人员。
我想知道我是否可以通过调用来解决问题tar_make_future()
,然后在调用中指定每个步骤需要多少工人tar_target
。我在下面有一个简单的示例,我希望data
使用 1 个工作人员执行该sums
步骤,以及使用 3 个工作人员执行该步骤。
我知道一种选择是在每个步骤中单独配置并行后端,然后调用tar_make()
以串行执行工作流。我很好奇我是否可以得到这种结果tar_make_future()
。