技巧以管理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工做區。 我使用導入腳本和數據腳本,並將我不想常常從新建立的任何特別大的數據對象輸出到文件中。 這樣,我老是從一個新的工做區開始,不須要清理大對象。 不過,這是一個很是好的功能。

相關文章
相關標籤/搜索