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你知道你可以通过接受答案来结束这个问题吗?请参见每个答案左侧的复选标记。如果将来有更好的答案出现,您也可以更改已接受的答案。