确定对象的内存使用情况?

我希望计算出我当前工作区中的每个对象使用了多少内存。有什么简单的方法吗?

93001 次浏览

不久前我从 给你偷了这个小金块:

sort( sapply(ls(),function(x){object.size(get(x))}))

这对我很有帮助

你可以试试 这个问题中的 lsos()函数:

R> a <- rnorm(100)
R> b <- LETTERS
R> lsos()
Type Size Rows Columns
b character 1496   26      NA
a   numeric  840  100      NA
R>

1. 根据物体大小

为了在 一个对象接一个对象的基础上获得内存分配,调用 Size ()并传递感兴趣的对象:

object.size(My_Data_Frame)

(除非传入的参数是变量,否则必须使用引号,否则就包装在 走开调用中。)变量名,然后省略引号,

您可以循环访问您的名称空间并获取其中所有对象的大小,如下所示:

for (itm in ls()) {
print(formatC(c(itm, object.size(get(itm))),
format="d",
big.mark=",",
width=30),
quote=F)
}

2. 按对象类型分类

若要按对象类型获取命名空间的内存使用情况,请使用 Profile ()

memory.profile()


NULL      symbol    pairlist     closure environment     promise    language
1        9434      183964        4125        1359        6963       49425
special     builtin        char     logical     integer      double     complex
173        1562       20652        7383       13212        4137           1

(还有另外一个功能,Size (),但是我听说和读到它似乎只能在 Windows 上工作。它只返回一个以 MB 为单位的值; 因此要获得会话中任何时候使用的最大内存,可以使用 memy.size (max = T)。

这个问题在很久以前就被提出并得到了合理的答案,但是我想让你们知道另一个有用的技巧来使用一个称为 数据的库和它的 ll()函数得到一个对象的大小。

library(gdata)
ll() # return a dataframe that consists of a variable name as rownames, and class and size (in KB) as columns
subset(ll(), KB > 1000) # list of object that have over 1000 KB
ll()[order(ll()$KB),] # sort by the size (ascending)

使用 dplyr的另一个(稍微漂亮一点的)选项

    data.frame('object' = ls()) %>%
dplyr::mutate(size_unit = object %>%sapply(. %>% get() %>% object.size %>% format(., unit = 'auto')),
size = as.numeric(sapply(strsplit(size_unit, split = ' '), FUN = function(x) x[1])),
unit = factor(sapply(strsplit(size_unit, split = ' '), FUN = function(x) x[2]), levels = c('Gb', 'Mb', 'Kb', 'bytes'))) %>%
dplyr::arrange(unit, dplyr::desc(size)) %>%
dplyr::select(-size_unit)

下面是一个基于 tidyverse的函数,它可以计算环境中所有对象的大小:

weigh_environment <- function(env){
  

purrr::map_dfr(env, ~ tibble::tibble("object" = .) %>%
dplyr::mutate(size = object.size(get(.x)),
size = as.numeric(size),
megabytes = size / 1000000))
  

}


Table 函数将内存和单元分开,以便于排序:

ls.obj <- {as.data.table(sapply(ls(),
function(x){format(object.size(get(x)),
nsmall=3,digits=3,unit="Mb")}),keep.rownames=TRUE)[,
c("mem","unit") := tstrsplit(V2, " ", fixed=TRUE)][,
setnames(.SD,"V1","obj")][,.(obj,mem=as.numeric(mem),unit)][order(-mem)]}


ls.obj


obj     mem unit
1:                obj1 848.283   Mb
2:                obj2  37.705   Mb

...

我用的是这个 链接的溶液

for (thing in ls()) { message(thing); print(object.size(get(thing)), units='auto') }

没问题!