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

时间:2009-09-08 17:36:13

标签: memory r

我想知道我当前工作区内每个对象使用了多少RAM。有一个简单的方法吗?

6 个答案:

答案 0 :(得分:162)

前段时间我从here偷走了这个小金块:

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

它很好地帮助了我

答案 1 :(得分:40)

<强> 1。 按对象大小

逐个对象的基础上获取内存分配,调用 object.size()并传入感兴趣的对象:

object.size(My_Data_Frame)

(除非传入的参数是变量,必须引用,或者包含在 get 调用中。)变量名,然后省略引号,

你可以遍历你的命名空间并获得其中所有对象的大小,如下所示:

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

<强> 2。 按对象类型

根据对象类型获取命名空间的内存使用情况,使用 memory.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 

(还有另一个函数, memory.size()但我听说过它只能在Windows上运行。它只返回一个以MB为单位的值;所以要获得最大内存在会话中的任何时间,使用memory.size(max = T))。

答案 2 :(得分:21)

您可以尝试this question中的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> 

答案 3 :(得分:11)

此问题已发布并且在很久以前得到了合法答案,但我想告诉您另一个有用的提示,即使用名为gdata的库及其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)

答案 4 :(得分:1)

使用 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)

答案 5 :(得分:0)

这是一个基于 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))
  
}