人们使用什么技巧来管理交互式 R 会话的可用内存?我使用下面的函数 [基于 Petr Pikal 和 David Hinds 在 2004 年在 r-help 列表中的帖子] 来列出(和/或排序)最大的对象并偶尔列出rm()其中的一些。但到目前为止,最有效的解决方案是……在具有充足内存的 64 位 Linux 下运行。
rm()
大家还想分享其他什么好技巧吗?请每个帖子一个。
# 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) }
为了进一步说明频繁重启的常见策略,我们可以使用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 上)。