Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:为了避免打扰其他服务器用户而创建低效的循环_R_Loops_Parallel Processing - Fatal编程技术网

R:为了避免打扰其他服务器用户而创建低效的循环

R:为了避免打扰其他服务器用户而创建低效的循环,r,loops,parallel-processing,R,Loops,Parallel Processing,我必须在服务器中处理数据集,并使用不同的参数 这是我正在做的一个虚构的例子 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) {

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

这是我正在做的一个虚构的例子

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循环有时效率很低,但在我的例子中,我不想以最大速度计算

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

在这种情况下我能做什么?如何进行有界并行化或类似的并行化


谢谢

我个人尽量避免多个循环(你知道吗,每次你运行两个以上的循环,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)
库(并行)
A有两种可能性:

1) 在每次迭代后添加
Sys.sleep(1)
。这不消耗任何资源,并且在每次迭代后1秒不执行任何操作


2) 降低进程的优先级。在ubuntu中,您可以通过
renice 20 PROCESS\u ID
实现这一点(20是最低优先级)

我想您可以从命令行使用适当的
--max mem size
启动R,我不确定我是否理解您想要什么。为什么不以最快的速度进行计算,以便它能快速地将ressource留给其他人?@d.b我希望如此,但我没有这样做的权限that@F.Priv这是不允许的,因为有一些进程正在实际运行,而干扰这些进程将是不允许的rude@pachamaltese你知道你可以通过接受答案来结束这个问题吗?请参见每个答案左侧的复选标记。如果将来有更好的答案出现,您也可以更改已接受的答案。