人们使用什么技巧来管理交互式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) }
我很幸运,仪器将大数据集保存在大约100 MB(32位二进制)的“块”(子集)中。 所以,在融合数据集以前,我能够依次进行预处理步骤(删除不具信息的部分,进行下采样)。 app
若是数据大小接近可用内存,则手动调用gc ()
会有所帮助。 函数
有时,不一样的算法须要更少的内存。
有时,向量化和内存使用之间须要权衡取舍。
比较: split
和lapply
与for
循环。 测试
为了快速,轻松地进行数据分析,我一般首先处理数据的一小部分随机子集( sample ()
)。 数据分析脚本/.Rnw完成后,数据分析代码和完整的数据将进入计算服务器进行整夜/周末/ ...计算。 大数据
我使用data.table包。 使用其:=
运算符,您能够: spa
这些操做data.table
没有复制(可能很大) data.table
,甚至没有一次。 code
data.table
使用的工做内存要少得多。 相关连接 : 对象
确保以可复制的脚本记录您的工做。 有时,请从新打开R,而后从新打开脚本的source()
。 您将清理掉再也不使用的全部内容,另外的好处是能够测试您的代码。 排序
这是一个好把戏。
另外一种建议是,尽量使用内存有效的对象:例如,使用矩阵而不是data.frame。
这并无真正解决内存管理问题,可是其中一个不为人知的重要功能是memory.limit()。 您可使用此命令memory.limit(size = 2500)增长默认值,其中大小以MB为单位。 如Dirk所述,您须要使用64位才能真正利用此优点。
我从不保存R工做区。 我使用导入脚本和数据脚本,并将我不想常常从新建立的任何特别大的数据对象输出到文件中。 这样,我老是从一个新的工做区开始,不须要清理大对象。 不过,这是一个很是好的功能。