【问题标题】:R: create inefficient loop in purpose to avoid bothering other server usersR:创建低效循环以避免打扰其他服务器用户
【发布时间】:2017-08-16 19:16:54
【问题描述】:

我必须在我的服务器中处理一个数据集,并使用不同的参数。

这是我正在做的一个虚拟示例

if (!require("pacman")) install.packages("pacman")
p_load(dplyr,DBI)

mtcars_experiments = dbConnect(RSQLite::SQLite(), "mtcars_experiments.sqlite")

for(a in -1:1) {
  for(b in -1:1) {
    for(c in -1:1) {
      mtcars_experiment = mtcars %>% 
        mutate(my_col = mpg^a + cyl^b + disp^c)

      dbWriteTable(mtcars_experiments, paste("mtcars_experiment",a,b,c, sep = "_"), mtcars_experiment)
    }
  }
}

我知道 for 循环有时效率低下,但就我而言,我不想以最大速度计算它。

我正在尝试找到一种既不那么慢又不那么快的方法,因为如果我在并行化中使用太多资源,那么服务器的其他用户在运行他们自己的代码时会遇到问题。

在这种情况下我该怎么办?如何进行有界并行化等?

谢谢!

【问题讨论】:

  • 我认为您可以使用适当的--max-mem-size从命令行启动 R
  • 我不确定我理解你想要什么。为什么不只是尽可能快地进行计算,以便快速将资源留给其他人?
  • @d.b 我希望但我没有权限这样做
  • @F.Privé 这样做是不允许的,因为实际上有进程正在运行并且干扰它是粗鲁的

标签: r loops parallel-processing


【解决方案1】:

两种可能:

1) 在每次迭代后添加Sys.sleep(1)。这不消耗任何资源,并且在每次迭代后 1 秒内什么也不做。

2) 降低进程的优先级。在 ubuntu 中,您可以通过 renice 20 PROCESS_ID 来执行此操作(20 是最低优先级)。

【讨论】:

  • @pachamaltese 你知道你可以通过接受答案来结束这个问题吗?请参阅每个答案左侧的复选标记。如果将来出现更好的答案,您还可以更改已接受的答案。
【解决方案2】:

我个人尽量避免多次循环(您是否知道每次运行超过两个循环时,Donald Knuth 都会杀死一只小狗?)。我更喜欢d 之类的对象(它包含指定向量的所有组合)。我用mcapply 运行d,你可以指定核心数量,在那里进行清理。而且我通常知道我在 HPCC 上有多少个内核。

library(parallel)

A <- 1:3
B <- 4:6
C <- 7:9
nCore <- 2

dummyFunction <- function(A, B, C) {
    mtcars$mpg ^ A - mtcars$cyl * B + mtcars$disp / C
}

d <- expand.grid(A, B, C)
colnames(d) <- c("A", "B", "C")

mclapply(1:nrow(d), 
         function(i) dummyFunction(d[i, ]$A, d[i, ]$B, d[i, ]$C),
         mc.cores = nCore)

这远不是一个好的答案,但这是我使用的。期待更多有经验的 R 用户的回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多