小编典典

在 R 会话中管理可用内存的技巧

all

人们使用什么技巧来管理交互式 R 会话的可用内存?我使用下面的函数 [基于 Petr Pikal 和 David Hinds 在 2004 年在
r-help 列表中的帖子] 来列出(和/或排序)最大的对象并偶尔列出rm()其中的一些。但到目前为止,最有效的解决方案是……在具有充足内存的 64 位
Linux 下运行。

大家还想分享其他什么好技巧吗?请每个帖子一个。

# improved list of objects
.ls.objects <- function (pos = 1, pattern, order.by,
                        decreasing=FALSE, head=FALSE, n=5) {
    napply <- function(names, fn) sapply(names, function(x)
                                         fn(get(x, pos = pos)))
    names <- ls(pos = pos, pattern = pattern)
    obj.class <- napply(names, function(x) as.character(class(x))[1])
    obj.mode <- napply(names, mode)
    obj.type <- ifelse(is.na(obj.class), obj.mode, obj.class)
    obj.size <- napply(names, object.size)
    obj.dim <- t(napply(names, function(x)
                        as.numeric(dim(x))[1:2]))
    vec <- is.na(obj.dim)[, 1] & (obj.type != "function")
    obj.dim[vec, 1] <- napply(names, length)[vec]
    out <- data.frame(obj.type, obj.size, obj.dim)
    names(out) <- c("Type", "Size", "Rows", "Columns")
    if (!missing(order.by))
        out <- out[order(out[[order.by]], decreasing=decreasing), ]
    if (head)
        out <- head(out, n)
    out
}
# shorthand
lsos <- function(..., n=10) {
    .ls.objects(..., order.by="Size", decreasing=TRUE, head=TRUE, n=n)
}

阅读 115

收藏
2022-03-11

共1个答案

小编典典

为了进一步说明频繁重启的常见策略,我们可以使用littler,它允许我们直接从命令行运行简单的表达式。这是我有时用来为简单的交叉产品计时不同的
BLAS 的示例。

 r -e'N<-3*10^3; M<-matrix(rnorm(N*N),ncol=N); print(system.time(crossprod(M)))'

同样地,

 r -lMatrix -e'example(spMatrix)'

加载 Matrix 包(通过 –packages | -l 开关)并运行 spMatrix 函数的示例。由于 r 总是以 ‘fresh’
开始,因此这种方法在包开发过程中也是一个很好的测试。

最后但同样重要的是,r 也适用于使用 ‘#!/usr/bin/r’ shebang-header 的脚本中的自动批处理模式。Rscript 是
littler 不可用的替代方案(例如在 Windows 上)。

2022-03-11