小编cra*_*ola的帖子

Ubuntu下R中的多核和内存使用情况

我在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)

ubuntu multicore r

27
推荐指数
1
解决办法
3078
查看次数

data.table和字符向量

在我的工作中,我经常将变量列表称为一个字符向量.

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))]愿意,但是不行.

我没有陷入困境,因为我有办法处理它 - 我只是想知道在我养成坏习惯之前,最好的解决方法是什么!

r data.table

10
推荐指数
1
解决办法
2110
查看次数

在R和Hive(Hadoop)数据库之间建立连接

有谁知道如何实现这一目标?

我假设RJDBC会提供帮助; 但是从我(可能是天真的)理解中,为此编写或调整Hive驱动程序需要进行一些调整.

相关文件:

欢迎任何帮助或建议!如果以前没有人这样做过,我会很乐意为解决方案编写一些代码,但我知道旁边没有Java.

hadoop hive r jdbc

8
推荐指数
1
解决办法
6359
查看次数

将未计算的命令传递给 R 中的函数

我是一个 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 <- 3orassign("a", 3)而不是"a<-3"or 的东西quote(a<-3)。我相信这就是这件事变得棘手的部分原因。似乎很难告诉 R 不要在本地评估它,而只是按字面意思发送它。基本上我希望我的函数有点像quote(),它不评估它的参数。
  • 关于我的意图的一些解释。我希望经常使用 Rserve 将命令传递到远程 R 守护进程。这些命令将是我自己的(或我的同事)的,并且守护进程受防火墙和身份验证保护(并且不会以 root 身份运行)——因此不必担心恶意命令被传递。
  • 老实说,这不是一个大问题,我会很高兴始终使用RSeval(c, quote(try())). 在这一点上,我认为这更像是对 R 微妙之处的有趣探究:-)

eval r

4
推荐指数
1
解决办法
1543
查看次数

如何避免打印包的作者信息?

可能重复:
库/包开发 - 加载时的消息

我想用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(),但无济于事.

谢谢

packages r data.table

2
推荐指数
1
解决办法
253
查看次数

标签 统计

r ×5

data.table ×2

eval ×1

hadoop ×1

hive ×1

jdbc ×1

multicore ×1

packages ×1

ubuntu ×1