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

人们使用什么技巧来管理交互式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)
}

#1楼

  1. 我很幸运,仪器将大数据集保存在大约100 MB(32位二进制)的“块”(子集)中。 所以,在融合数据集以前,我能够依次进行预处理步骤(删除不具信息的部分,进行下采样)。 app

  2. 若是数据大小接近可用内存,则手动调用gc ()会有所帮助。 函数

  3. 有时,不一样的算法须要更少的内存。
    有时,向量化和内存使用之间须要权衡取舍。
    比较: splitlapplyfor循环。 测试

  4. 为了快速,轻松地进行数据分析,我一般首先处理数据的一小部分随机子集( sample () )。 数据分析脚本/.Rnw完成后,数据分析代码和完整的数据将进入计算服务器进行整夜/周末/ ...计算。 大数据


#2楼

我使用data.table包。 使用其:=运算符,您能够: spa

  • 经过引用添加列
  • 按引用修改现有列的子集,并按引用修改组
  • 经过引用删除列

这些操做data.table没有复制(可能很大) data.table ,甚至没有一次。 code

  • 聚合也特别快,由于data.table使用的工做内存要少得多。

相关连接 : 对象


#3楼

确保以可复制的脚本记录您的工做。 有时,请从新打开R,而后从新打开脚本的source() 。 您将清理掉再也不使用的全部内容,另外的好处是能够测试您的代码。 排序


#4楼

这是一个好把戏。

另外一种建议是,尽量使用内存有效的对象:例如,使用矩阵而不是data.frame。

这并无真正解决内存管理问题,可是其中一个不为人知的重要功能是memory.limit()。 您可使用此命令memory.limit(size = 2500)增长默认值,其中大小以MB为单位。 如Dirk所述,您须要使用64位才能真正利用此优点。


#5楼

我从不保存R工做区。 我使用导入脚本和数据脚本,并将我不想常常从新建立的任何特别大的数据对象输出到文件中。 这样,我老是从一个新的工做区开始,不须要清理大对象。 不过,这是一个很是好的功能。

相关文章
相关标签/搜索