问题标签 [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.

0 投票
0 回答
36 浏览

r - 将来不会使用嵌套计划(多会话)释放内存

最近我一直在使用future(and future.applyand furrr) 在 R 中进行一些并行处理,这主要是很棒的,但是我偶然发现了一些我无法解释的东西。这可能是某个地方的错误,但也可能是我的草率编码。如果有人可以解释这种行为,将不胜感激。

设置

我正在对我的数据的不同子组进行模拟。对于每个组,我想运行模拟n时间,然后计算结果的一些汇总统计数据。这是一些示例代码,用于重现我的基本设置并演示我看到的问题:

外部循环用于测试两种并行化策略:是并行化数据子集还是并行化 100 次模拟。

一些警告

  • 我意识到并行化模拟并不是理想的设计,而且将数据分块以向每个内核发送 10-20 个模拟会更有效,但这并不是重点。我只是想了解内存中发生了什么。
  • 我还认为plan(multicore)这里可能会更好(尽管我确定是否会)但我更感兴趣的是弄清楚发生了什么plan(multisession)

结果

我在 8-vCPU Linux EC2 上运行它(如果人们需要,我可以提供更多规格)并根据结果创建以下图(在底部绘制代码以实现可重复性):

内存曲线图

首先,plan(list(multisession, sequential))速度更快(正如预期的那样,请参见上面的警告),但我对内存配置文件感到困惑。plan(list(multisession, sequential))我期望的总系统内存使用量保持不变,因为我假设res每次循环都会覆盖对象。

但是,随着程序运行,内存使用量会稳步增长。plan(list(sequential, multisession))似乎每次通过循环时res都会创建对象,然后在某个地方徘徊,占用内存。在我的真实示例中,它变得足够大,以至于它填满了我的整个(32GB)系统内存并在大约中途终止了进程。

情节扭曲:它只在嵌套时发生

这是真正让我感到困惑的部分!当我将外部更改为future_lapply常规lapply并设置时plan(multisession),我看不到它!从我对这个“未来:拓扑”小插图的阅读来看,这应该是相同的,plan(list(sequential, multisession))但情节并没有显示内存在增长(事实上,它几乎与plan(list(multisession, sequential))上面的情节相同)

一级情节

注意其他选项

实际上,我最初发现了这个,furrr::future_map_dfr()但为了确保它不是 中的错误furrr,我尝试了它future.apply::future_lapply()并得到了显示的结果。我试图用 just 来编写代码future::future(),得到了非常不同的结果,但很可能是因为我编写的代码实际上并不等效。furrr如果没有or提供的抽象层,我没有太多直接使用期货的经验future.apply

同样,非常感谢对此的任何见解。

绘图代码

0 投票
1 回答
290 浏览

r - 是什么导致“parallel::parSapply”中的“外部指针无效”错误?

我试图将一个对象(即R6类;这个特定的对象)传递给使用创建的许多工作人员parallel::makePSOCKcluster(),我得到:

基于Henrik Bengtsson这篇文章

[...] 有一组对象类型不能被传递到另一个 R 进程并且可以在那里工作。

我想了解我试图传递的对象是否属于这一类,如果是,我的选择是什么。

这是一个MRE:

场景1:( 工作)model在每个工人内部创建对象。

场景 2:( 不工作)主要创建model对象并将其传递给工作人员。

方案 1有效,所以我似乎可以osqp在工人内部使用。但是,当我在外部创建该对象并将其传递给工作人员(即场景 2)时,它失败了。

为了提供更多的上下文,我无法控制model创建。我收到一个在别处创建的实例,我只被允许在该实例上调用几个方法(例如,$Update())。


更新 1

这似乎与R6实例是环境这一事实无关。以下仍然按预期工作。

0 投票
1 回答
148 浏览

r - 在 Golem Shiny 应用程序中使用 {future} 和 {furrr} 函数时出现错误,它来自什么?

我目前正在开发一个名为“package_name”(这是我的要求)的 Golem Shiny 应用程序,我创建的一些函数需要使用{furrr}{future}包中的函数。但是,每当我尝试运行它们时,都会出现以下错误:

错误:没有名为“package_name”的包

请注意,只要不使用任何一个包的任何功能都可以正常工作。

有谁知道问题可能是什么?

谢谢 !

0 投票
1 回答
45 浏览

r - 使用并行进程进行 API 调用使用未来

我闪亮的应用程序显示了 10 种不同的光伏系统。对于每个光伏系统,该应用程序都会进行完全相同的计算。我使用闪亮的模块来减少行数。过程如下:

  1. 数据从 API(模块)加载
  2. 重新计算来自 api 的数据(模块)
  3. 使用信息框、ggplot 等对数据进行图形处理。

目前代码被执行,加载API数据的等待时间很长。我想通过使用 future 包来减少最终用户的等待时间。

目前我不明白如何将 future() 实现到我闪亮的模块中。

例如:

API api <- function(id,df, api_siteid, api_key, startmonth, startdate, url,db_location){ 一些代码}

模块服务器

api() 的结果是将新数据写入 csv 文件。之后 csv 文件被加载到 bb55_act = df 中。

对每个光伏系统重复此过程。我想并行化 API 调用,因为这是代码中主要耗时的部分。

谢谢你的帮助!

0 投票
1 回答
81 浏览

r - 为什么 withr::with_seed 和 R.utils::withSeed 在异步代码中使用时会产生不同的结果?

我正在尝试使用 R 学习异步编程,以便我可以实现一个需要生成具有指定种子的随机数(始终具有指定种子)的应用程序。我一直在使用R.utils::withSeed它,但我知道它withr::with_seed也存在,所以我想我可以检查一下。

我知道随机数生成很棘手,所以我一直在尝试运行简单的示例来尝试了解事情是如何工作的。我需要:

  • ...使用相同的种子时总是得到相同的随机数
  • ...无论我是否使用异步框架,都可以使用相同的种子获得相同的随机数(因此我应该能够在 Promise 之外运行代码并获得相同的答案)

在下面的代码中,我定义了两个函数来生成随机数,使用withr::with_seed或设置种子R.utils::withSeed

  • 当在 promise 之外运行时,这两个函数给了我相同的答案。
  • 这两个函数在 Promise 中运行时给出不同的答案。
  • withr::with_seed版本在承诺内部或外部给出了相同的答案。
  • R.utils::withSeed版本在承诺内部或外部给出了不同的答案。

然而,答案似乎在多次运行中是一致的。

我的问题是:为什么?这是一个错误R.utils::withSeed,还是我误解了什么?


代码

0 投票
1 回答
254 浏览

r - 闪亮的应用程序下载按钮和future_promise:enc2utf8 中的错误:参数不是字符向量

我正在尝试以闪亮的方式创建下载处理程序,但使用 future_promise() 因为写入文件可能需要一些时间。这是我想做的一个工作示例,但不使用异步框架:

一个正常工作的 .Rmd 闪亮应用程序:当您单击按钮时,它会将 10 个随机偏差写入文件并将其作为下载提供。我添加了 5 秒的延迟。

我正在尝试使用 future_promise 在异步框架中实现这一点。这是 {future}/{promises} 版本:

当我在 Firefox 中单击按钮时,我没有得到任何文件,在 R 控制台中,显示如下:

经过一些调试后,我相信会发生这种情况,因为无论运行下载处理程序的什么都在运行该filename函数,期待一个字符向量,并获得一个承诺。但我不确定如何解决这个问题。

我看到了这个问题,其中提问者似乎有同样的问题,但没有提供解决方案(他们的例子不可复制)。

我怎样才能解决这个问题?

0 投票
0 回答
23 浏览

r - 在 R 未来为管道工 API 重新使用持久会话变量

我希望使用此 RStudio 视频中演示的 Plumber+Future 模式来构建一个 Plumber API,以充分利用多个可用内核。

在我的特殊情况下,有一些缓慢/昂贵的初始模型加载操作我想确保在会话/线程启动时最初发生,而不是根据请求按需重复。

正如我从多会话示例中了解到的那样,会话范围内的变量被复制,并且工作人员中的操作不会影响主线程(示例b可以rm(pid)并且pid变量仍然存在于主线程中)

...但是我不是 100% 清楚这些会话变量在未来之外的生命周期,例如pid:当每个 R 会话被创建然后重新用于每个未来时,它们是否会预先独立初始化?每次创建未来时,是否会从主线程发生一些内存复制?

具体来说,如果我有类似下面的NCPU/会话设置:

  • 是否会在启动时loadMyFancyModel被调用,初始化每个会话它自己的副本,然后将其重新用于它要处理的任何未来调用?Nmodel
  • 如果req比 大/复杂得多scoring_X,但提取 的scoring_X计算简单,那么在主线程中将其范围缩小是否有任何进程间通信好处,如上所示?或者未来的工人会话是否会req因为它在范围内而收到?
0 投票
0 回答
75 浏览

r - R:并行化线性回归

我正在对美国所有 3000 多个县的 COVID-19 数据进行线性回归,并且代码运行速度很慢。是否有并行化的选项?

我试过furrr::future_map()了,但它并没有真正加快这个过程。无论有无,CPU 使用率约为 26%,furrr:future_map并且只有一个进程在运行。

示例代码:

0 投票
1 回答
56 浏览

r - 在反应式 R 中使用 future 和 promise

我有一个关于 R Shiny 的问题,尤其是关于提高我的 Shiny 应用程序性能的方法。我正在使用一些需要很长时间才能运行的 SQL 查询以及一些需要时间才能显示的情节。我知道可以使用futurepromises但我不知道如何在反应式表达式中使用它们。

我在下面向您展示一个非常简单的示例:

在这种情况下,我们可以看到应用程序在显示整个应用程序之前等待绘图部分结束计算。但是,即使带有绘图的部分尚未完成计算,我也希望显示数据表。

非常感谢您的帮助!

0 投票
0 回答
70 浏览

osrm - 通过在 osrm::osrmIsochrone 上应用 furrr::future_map 不会提高速度/性能

下面的代码显示了一个计算量很大的示例(两个示例约 430 秒)。我试图通过使用 furrr::future_map 来提高效率,但到目前为止我还没有看到任何区别。

底层函数 osrm::osrmIsochrone 非常繁重,所以如果有人能指出我正确的方向,我会非常高兴。