【问题标题】:Determining memory usage of objects?确定对象的内存使用情况?
【发布时间】:2010-11-26 14:04:45
【问题描述】:

我想计算出我当前工作空间中的每个对象使用了多少 RAM。有没有简单的方法可以做到这一点?

【问题讨论】:

  • 我不明白为什么这个问题被关闭了。这个问题询问确定内存使用情况,这与管理内存的链接“重复”明显不同。例如,the most up-voted answer 根本没有提及内存使用确定。
  • 除了所有答案,我想参考从Advanced R阅读内存管理:adv-r.had.co.nz/memory.html

标签: memory r


【解决方案1】:

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

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

它对我很有帮助

【讨论】:

  • 另外,如果想要 R 会话使用的总内存,可以使用 object.size(x=lapply(ls(), get))print(object.size(x=lapply(ls(), get)), units="Mb")
  • 那个漂亮的小东西误导了我,因为我有一个叫做“x”的大东西(提示:它看起来很小);这是一个替代品:sort( sapply(mget(ls()),object.size) )
  • 您也可以使用format 来获得人类可读的尺寸:sort(sapply(ls(), function(x) format(object.size(get(x)), unit = 'auto')))
  • @savagent 没错,根据adv-r.had.co.nz/memory.html
  • 我认为使用magrittr 会更干净一些。可以Mb <- ls() %>% sapply(. %>% get %>% object.size %>% '/'(10^6)) 然后cbind(Mb, "Mb") %>% as.data.frame
【解决方案2】:

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))。

【讨论】:

  • 有助于以人类可读的方式打印:print(object.size(my_object), units = "auto")format(object.size(my_object), units = "auto")
【解决方案3】:

你可以试试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> 

【讨论】:

    【解决方案4】:

    这个问题很久以前就已经发布并得到了合理的答案,但我想让您知道另一个有用的技巧,以使用名为 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)
    

    【讨论】:

    • 第三行可以用 dplyr 轻松排序,如下所示:subset(ll(), KB > 1000) %>%arrange(desc(KB))
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      一个将内存和单元分开以便于排序的data.table函数:

      ls.obj

      ls.obj

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

      ...

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2014-12-03
          • 2010-09-28
          • 2011-06-15
          • 2010-10-08
          • 2014-07-30
          • 2011-11-02
          • 2012-01-13
          • 1970-01-01
          相关资源
          最近更新 更多