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

Jos*_*ich 128 memory r

我想知道我当前工作区内每个对象使用了多少RAM.是否有捷径可寻?

JD *_*ong 171

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

sort( sapply(ls(),function(x){object.size(get(x))})) 
Run Code Online (Sandbox Code Playgroud)

它对我有好处

  • 另外,如果想要一个R会话使用的总内存,可以做`object.size(x = lapply(ls(),get))`和`print(object.size(x = lapply(ls(), get)),units ="Mb")` (15认同)
  • 你也可以使用`format`来获得人类可读的大小:`sort(sapply(ls(),function(x)format(object.size(get(x)),unit ='auto')))` (8认同)
  • 那个漂亮的小笨蛋误导了我,因为我有一个叫做'x'的大牌(提示:它看起来很小); 这是一个替代品:`sort(sapply(mget(ls()),object.size))`. (4认同)
  • @savagent 是的,根据 http://adv-r.had.co.nz/memory.html (3认同)
  • @tflutre 我的理解是这种事情可能会产生误导,因为 R 是写时复制。如果我采用 some_list <- some_other_list,则 some_list 的大小将报告为与 some_other_list 相同的大小,但如果我只从 some_list 读取,则内存将被共享。有人可以确认这是否正确吗? (2认同)
  • 我认为使用 `magrittr` 会更简洁一些。可以做`Mb <- ls() %>% sapply(. %>% get %>% object.size %>% '/'(10^6))` 然后`cbind(Mb, "Mb") %> % as.data.frame` (2认同)

dou*_*oug 43

1. 按物体大小

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

object.size(My_Data_Frame)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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 
Run Code Online (Sandbox Code Playgroud)

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

  • 以人类可读的方式打印很有用:`print(object.size(my_object), units = "auto")` 或 `format(object.size(my_object), units = "auto")` (2认同)

Dir*_*tel 21

你可以尝试这个问题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> 
Run Code Online (Sandbox Code Playgroud)


Bla*_*ard 13

这个问题已经发布并且很久以前得到了合法的答案,但是我想让你知道另一个有用的技巧,用一个名为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)
Run Code Online (Sandbox Code Playgroud)