我在Ubuntu工作站上运行R,它有8个虚拟内核和8 Gb内存.我希望经常使用多核软件包来并行使用8个核心; 但是我发现整个R过程重复了8次.由于R实际上似乎使用了比gc中报告的更多的内存(即使在gc()之后也是如此),这意味着即使相对温和的内存使用(一个200Mb对象)在重复8次时变得难以处理内存.我调查了bigmemory让子进程共享相同的内存空间; 但它需要对我的代码进行一些重大改写,因为它不处理数据帧.
有没有办法在分叉之前使R尽可能精简,即让OS尽可能多地回收内存?
编辑:我想我明白现在发生了什么.问题不在我想象的地方 - 父线程中存在且未被操纵的对象不会重复八次.相反,我的问题来自于我正在使每个子进程执行的操作的性质.每个人都必须操纵一个具有数十万级别的重要因素,我认为这是一个记忆很重的一点.结果,确实存在总存储器负载与核心数成比例的情况; 但没有我想象的那么戏剧化.我学到的另一个教训是,有4个物理内核+超线程的可能性,超线程实际上对于R来说通常不是一个好主意.增益很小,内存成本可能非常重要.所以我从现在开始研究4核.
对于那些想要试验的人来说,这是我运行的代码类型:
# Create data
sampdata <- data.frame(id = 1:1000000)
for (letter in letters) {
sampdata[, letter] <- rnorm(1000000)
}
sampdata$groupid = ceiling(sampdata$id/2)
# Enable multicore
library(multicore)
options(cores=4) # number of cores to distribute the job to
# Actual job
system.time(do.call("cbind",
mclapply(subset(sampdata, select = c(a:z)), function(x) tapply(x, sampdata$groupid, sum))
))
Run Code Online (Sandbox Code Playgroud) 在我的工作中,我经常将变量列表称为一个字符向量.
A <- data.table(var1 = 1:10, var2 = 11:20, var3 = 21:30)
vecvar <- c("var1", "var2", "var3")
Run Code Online (Sandbox Code Playgroud)
只要有可能,我想使用vecvar
而不是枚举变量,因为这使得我的代码对于将来的应用程序对于稍微不同的变量列表更加健壮.
我最近发现data.table
,尽管我喜欢语法和效率增益的一般优雅,但我发现它与我上面提到的倾向有点冲突.的确,A[, vecvar]
不行.
我尚未决定解决这个问题的最佳方法.
A[, vecvar, with=F]
会工作,但并不总是方便(例如A[, list(vecvar, var1+var2), with=F]
不会工作).
A[, sapply(vecvar, get)]
虽然A[, sapply(vecvar, function(x) get(x))]
愿意,但是不行.
我没有陷入困境,因为我有办法处理它 - 我只是想知道在我养成坏习惯之前,最好的解决方法是什么!
有谁知道如何实现这一目标?
我假设RJDBC会提供帮助; 但是从我(可能是天真的)理解中,为此编写或调整Hive驱动程序需要进行一些调整.
相关文件:
欢迎任何帮助或建议!如果以前没有人这样做过,我会很乐意为解决方案编写一些代码,但我知道旁边没有Java.
我是一个 R 新手,我被一个看似简单的问题所困扰,但却触及了关于如何以及何时在 R 中评估事物的非常深刻的问题。
我经常使用 Rserve;远程评估事物的典型语法重复输入有点麻烦:
RSeval(connection, quote(try(command)))
Run Code Online (Sandbox Code Playgroud)
所以我想要一个函数 r 只用调用来做同样的事情:
r(command)
Run Code Online (Sandbox Code Playgroud)
我的第一次天真的尝试注定会失败:
r <- function(command) {
RSeval(c, quote(try(command)))
}
Run Code Online (Sandbox Code Playgroud)
您已经猜到了:这实际上是发送try(command)
到我困惑的 Rserve 守护进程。我希望command
得到部分评估,如果这有意义的话——即被我作为参数输入的内容替换,但不在本地评估它。
我寻找解决方案,浏览了引用、替代、评估、调用等的文档。但我找不到有效的东西。要么command
在本地进行评估,要么根本不评估。
这不是一个大问题,我可以quote(try())
一直输入整个该死的东西;但此时我最好奇的是如何让它发挥作用!
编辑:关于我想要做什么的更多解释。
command
理想情况下是对函数的调用,即不是字符串。类似于a <- 3
orassign("a", 3)
而不是"a<-3"
or 的东西quote(a<-3)
。我相信这就是这件事变得棘手的部分原因。似乎很难告诉 R 不要在本地评估它,而只是按字面意思发送它。基本上我希望我的函数有点像quote()
,它不评估它的参数。RSeval(c, quote(try()))
. 在这一点上,我认为这更像是对 R 微妙之处的有趣探究:-)可能重复:
库/包开发 - 加载时的消息
我想用Rapache建立一个Web界面; 但是,底层R代码使用显示作者快速消息的包.例如,对于data.table
,
Quick start guide : vignette("datatable-intro") Homepage : http://datatable.r-forge.r-project.org/
Run Code Online (Sandbox Code Playgroud)
有办法避免这种情况吗?我尝试了suppressMessages()
,并quietly
选择library()
,但无济于事.
谢谢