1

我正在尝试构建一个在AWS ECS上运行并涉及包{future}{future.callr}{furrr}的 dockerized R 微服务(因此隐含{callr}{processx}

当我使用限制为1 个 CPU650 MB内存的 docker 容器进行本地测试时(与我的客户的舞台设置相匹配;生产有1500 MB4 个 CPU),一切正常。

但是,在实际的 AWS 实例上,我收到以下错误:

错误一:

Error in get_result(out, private$options) : 
  callr subprocess failed: could not start R, exited with non-zero status, has crashed or was killed

错误2:

Error in rethrow_call(c_processx_exec, command, c(command, args), stdin,  : 
  Cannot fork when running '/usr/local/lib/R/bin/R' (system error -12, Unknown error -12) @unix/processx.c:499 (processx_exec)

我在这里完全超出了我的深度,谁能给我一个提示,告诉我发生了什么和/或我该如何解决这个问题?

在这个问题上提供一个代表有点困难,但这里是一般设置的主要要点:

确保后台进程

ensure_background_processes <- function(workers_level_1, workers_level_2){
  future::plan(
    list(
      future::tweak(future.callr::callr, workers = workers_level_1),
      future::tweak(future.callr::callr, workers = workers_level_2)
    )
  )
}

处理两个操作“同时”发生的包装函数,其中每个操作需要在 3 个实体上并行化(x例如长度为 3)

foo <- function(x) {
  future::future({
    x %>%
      furrr::future_map(
        ~.x %>% bar()
      )
  })

  future::future({
    x %>%
      furrr::future_map(
        ~.x %>% baz()
      )
  })
}

每个并行化周期中要执行的实际功能

bar <- function(x) {
  # Do something useful in a while loop
}

baz <- function(x) {
  # Do something useful in a while loop
}
4

0 回答 0