Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 确定对象的内存使用情况?_Memory_R - Fatal编程技术网

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

Memory 确定对象的内存使用情况?,memory,r,Memory,R,我想计算出当前工作区中每个对象使用了多少RAM。有什么简单的方法可以做到这一点吗?不久前,我从: 它对我很有用您可以从以下位置尝试lsos()功能: R>a b lsos() 键入行和列的大小 b字符149626NA 数字840 100 NA R> 1。按对象大小划分 memory.profile() NULL symbol pairlist closure environment promise language 1 9

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

不久前,我从:


它对我很有用

您可以从以下位置尝试
lsos()
功能:

R>a b lsos()
键入行和列的大小
b字符149626NA
数字840 100 NA
R>
1。按对象大小划分

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 
要逐个对象获得内存分配,请调用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()

   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.profile()


(还有另一个函数,memory.size(),但我听说它似乎只在Windows上工作。它只返回一个以MB为单位的值;因此,要获得会话中任何时候使用的最大内存,请使用memory.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))
  
}

weight_环境%
dplyr::mutate(size=object.size(get(.x)),
尺寸=作为数字(尺寸),
兆字节=大小/1000000))
}

此外,如果想要R会话使用的总内存,可以执行
object.size(x=lappy(ls(),get))
print(object.size(x=lappy(ls(),get)),units=“Mb”)
这个漂亮的小突起误导了我,因为我有一个叫做“x”的大东西(提示:它看起来很小);这里有一个替代方法:
sort(sappy(mget(ls()),object.size))
。你也可以使用
格式
来获取人类可读的大小:
sort(sappy(ls(),function(x)格式(object.size(get(x)))
@savagent这是正确的,我认为使用
magrittr
更干净一些。可以做
Mb%sapply(.%>%get%%>%object.size%%>%'/'(10^6))
然后
cbind(Mb,“Mb”)%%>%as.data.frame
以人类可读的方式打印有用:
打印(object.size(my_object)、units=“auto”)
格式(object.size(my_object)、units=“auto”)
我不明白为什么这个问题被解决了。这个问题问的是确定内存使用情况,这与管理内存的链接“复制”明显不同。例如,没有提到内存使用率的确定。除了所有的答案,我想提及从Advanced R读取内存管理:
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))
  
}