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