问题标签 [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未来的多会话限制CPU数量
我目前正在使用 future 包进行并行化,如下所示:
问题是它使用了服务器上的所有 CPU。我想通过设置如下参数来限制使用的 CPU 数量:workers = 18
r - 如何异步处理knitr代码块?
我想知道是否有一种方法可以异步处理RMarkdown 文档中的knitr代码块。
这就是我的想法:想象一个包含复杂数据分析的文档被分解成几个代码块,其中几个代码块包含复杂的代码,因此运行速度很慢。这些代码块彼此之间没有任何依赖关系,它们的输出要么是绘图、表格,要么是其他一些数字结果,但不是任何其他代码块使用的任何数据对象。
如果我可以并行处理这些代码块,那就太好了。通常,knitr按顺序处理每个代码块,因此,可能有几个代码块在一个处理缓慢的代码块后面的队列中。像future和promise这样的R 包支持异步编程,我想知道是否可以利用它以相同的方式并行处理knitr代码块。我知道我可以将慢速代码块放在单独的 Rmd 文件中,然后在调用中的代码块调用knitr::knit_child
中future::future_map
,但是将所有内容放在同一个文件中会更好。我也知道可以使用child
代码块中的选项。此外,我知道我可以通过使用ref.label
选项按名称调用代码块来重用代码块。所以我想知道是否有任何方法可以劫持这些功能中的任何一个(可能使用future),以便在执行传递到后续代码块时延迟呈现代码块输出。或类似的东西。只是探索超越knitr中代码块的顺序计算并使用多核或多会话处理的可能性空间。
r - 加速分组数据的处理
更新:
我尝试了@Adam 的方法,它成功了。使用 8 个核心,处理只需要 20 分钟。到目前为止这很棒。
但是我遇到了另一个问题:foreach
's %dopar%
operator forks 工作区n
时间(等于注册的核心数)。这本身没有问题,但是对于 20 GB 的数据集,这将很快变得丑陋。
所以对原始问题的限制:可以在没有整个数据集在内存分叉n
时间的情况下完成吗?
情况:
我需要处理一个大标题(>3000 万行)。tibble 正在分组,并为每个组调用一个函数。
在第一步中,我通过仅提取那些在列中共享一个值的行来减少数据集,name
如下所示:
在那之后,我如上所述处理这些重复项:
重复的分组group_by
通常导致大约>500k 组。每个组都由 处理myFunction()
。现在,这个处理大约需要90 分钟,这还可以,但远不能令人满意。
问题:
有没有办法加快这些组的处理速度,这样这项任务就不会花费 90 分钟,而是显着减少时间?
(包括但不限于多处理)
r - R包Future - 为什么与远程工作者的循环会挂起本地R会话
如果您需要示例,请告诉我,但我认为没有必要。
我编写了一个 for 循环,它生成期货并将每个结果存储在一个列表中。它plan
是远程的,比如说,由一台互联网机器上的 4 个节点组成。
在部署了第 4 个 future 并且远程机器的所有核心都忙后,R 挂起,直到其中一个空闲。由于我没有使用任何本地内核,为什么它必须挂起?这是改变这种行为的方法吗?
r - 在另一个函数中运行 parLapply 和 future_map 会不必要地将大对象复制到每个工作人员
我一直在寻找替代方法,furrr:future_map()
因为当此函数在另一个函数中运行时,它会将在该函数中定义的所有对象复制到每个工作人员,而不管这些对象是否被显式传递(https://github.com/DavisVaughan/furrr/issues/ 26 )。
使用时看起来像parLapply()
做同样的事情clusterExport()
:
由reprex 包(v0.3.0)于 2020-01-06 创建
我怎样才能big_obj
避免被复制到每个工人?我使用的是 Windows 机器,所以分叉不是一种选择。
r - 如何正确使用 R 未来 (furrr) 包中的集群计划
我目前正在使用furrr
我的模型创建更有条理的执行。我使用 adata.frame
以有序的方式将参数传递给函数,然后使用 将furrr::future_map()
函数映射到所有参数。在我的本地机器(OSX)上使用顺序和多核期货时,该功能可以完美运行。
现在,我想测试创建自己的 AWS 实例集群的代码(如图所示)。
我使用链接的文章代码创建了一个函数:
然后,我创建集群对象,然后检查它是否连接到正确的实例
当我打印时,f
我得到了我的一个远程实例的规格,这表明套接字已正确连接:
但是当我使用我的集群计划运行我的代码时:
我收到以下错误:
我无法弄清楚引擎盖下发生了什么,我也无法traceback()
从我的远程机器上看到错误。我已经测试了与文章中示例的连接,并且事情似乎运行正常。我想知道为什么要tempdir
在执行期间创建一个。我在这里想念什么?
(这也是repo中的一个问题)furrr
r - 在 Linux 上从 future_apply() 杀死期货
我用来future_lapply()
在 Linux 机器上并行我的代码。如果我提前终止进程,则只有一名工作人员被释放,并行进程继续存在。我知道我可以进入tools::pskill(PID)
以结束每个单独的进程,但这很乏味,因为我在 26 个内核上运行。
如果有办法从 R 对 linux 进行系统调用以获取所有活动的 PID?
我这样设置future_lapply
:
因为我的并行会话仍在运行。
使用会话信息更新:
version.string R 版本 3.6.2 (2019-12-12)
future 1.12.0
future.apply 1.2.0
r - 使用 Future 包在 R 中进行并行处理
我正在尝试使用“Future”包并行运行一堆任务,由于某种原因,它无法找到我希望它找到的数据帧。我创建了下面的示例程序来展示我在做什么。我应该将全局数据导出到每个子进程吗?我目前没有这样做,因为我在某处读到它是在使用多会话计划时自动完成的。知道我做错了什么吗?
r - 有没有更好的方法在函数中使用 disk.frame ?
我创建了一些需要处理 adisk.frame
或 adata.table
作为输入的函数。由于执行时未找到对象,我从其中future
使用的包中收到错误。disk.frame
我认为这是因为future
在全局环境中寻找要传递给每个工作人员的对象,而没有识别出我在函数执行环境中生成的对象。超级赋值<<-
解决了这个问题,但我想知道是否有更好或更合适的方法来实现disk.frame
在函数中使用 's?
我在 Windows 10 x64 上使用最新版本的 R 版本 4.0.0 disk.frame '0.3.5'
。future '1.17.0'
我已经使用 iris 数据集复制了一个示例:
设置
工作磁盘框架操作
这是有效的,因为filterVals
它是在全球环境中。
在函数中执行 disk.frame 操作
r - R未来包 - 理解错误消息
我在 Linux (R 3.6.0) 上提交了如下两个工作。请参见下面的示例代码。
如果由于数据大小而导致作业花费超过 3 分钟,那么我将遇到错误。如果数据很小,那么我不会出错。我错过了什么吗?
sendMaster(try(eval(expr, env),silent = TRUE)) 中的错误:忽略 SIGPIPE 信号调用:source ... run.MulticoreFuture -> do.call -> -> sendMaster
其他参考:
我发现在不同的博客上已经讨论了类似的问题。听起来错误已在 R 3.6.0 中修复,但即使使用 R 3.6.0 我仍然得到它
https://r.789695.n4.nabble.com/error-in-parallel-sendMaster-td4760382.html
https://github.com/wch/r-source/commit/e08cffac1c5b9015a1625938d568b648eb1d8aee
我的 job1 和 job2 是独立的并将输出写入文件,因此我不需要将任何内容发送回主作业。有什么方法可以在工作中定义说没有必要将任何东西发回主要工作?
更新
如果我使用计划(多会话),我不会收到错误消息
会话和核心信息