相关疑难解决方法(0)

如何找到内存中最大的对象?

我想在内存中创建一个包含 10 个最大对象的表,并且具有大小。

R 中的等效函数: 在 R 会话中管理可用内存的技巧

lsos()
#                          Type Size(MB)   Rows Columns
#d2                  data.table 157.8364 281444      74
#d                   data.table  62.2658 816078      11
Run Code Online (Sandbox Code Playgroud)

编辑:@ 9.0 这是我的尝试。

我必须使用globals(),使用gc.get_objects()使我的电脑很慢。我不确定globals()给了我我想要的。 如何在python中获取所有已初始化对象和函数定义的列表?

def lsos(n=10):

    import pandas as pd
    import sys

    all_obj =globals()

    object_name = list(all_obj).copy()
    object_size = [sys.getsizeof(all_obj[x]) for x in object_name]

    d = pd.DataFrame(dict(name = object_name, size = object_size))
    d.sort_values(['size'], ascending=[0],inplace=True)

    return(d.head(n))


v  = list(range(1000))
v2 = list(range(10000))
v3 = list(range(100000))
v4 = v3
lsos()

    # …
Run Code Online (Sandbox Code Playgroud)

python python-3.x

8
推荐指数
1
解决办法
5769
查看次数

如何找到没有存储在 .GlobalEnv 中的重物?

我试图找出哪些对象在我的 R 会话中占用了大量内存,但问题是该对象可能是在未知环境中以未知名称无形创建的。

如果对象是存储在.GlobalEnv或已知的环境中,我可以很容易地使用像一个策略ls(enviro)+get()+object.size()(参见lsos上这个职位为例)列出的所有对象和它们的大小,让我找出重物。

但是,有问题的对象可能不会存储在 中.GlobalEnv,而可能位于由外部包隐式创建的某个模糊环境中。在这种情况下,如何确定哪个对象使用了大量 RAM?

最好的案例研究是在专用环境中ggplot2创建.last_plot。在引擎盖下查看可以发现它存储在 中environment(ggplot2:::.store$get),因此可以找到它并最终将其删除。但是如果我不知道那个位置或先验的名字,有没有办法.last_plot在内存中找到一个叫做某处的重物?

pryr::mem_used()
#> 34.7 MB

## example: implicit creation of heavy and hidden object by ggplot
path <- tempfile() 
if(!file.exists(path)){
  saveRDS(as.data.frame(matrix(rep(1,1e07), ncol=5)), path)
}

pryr::mem_used()
#> 34.9 MB
p1 <- ggplot2::ggplot(readr::read_rds(path), ggplot2::aes(V1))
rm(p1)
pryr::mem_used()
#> 127 MB

## Hidden object is not in .GlobalEnv
ls(.GlobalEnv, all.names = TRUE)
#> [1] "path"

## Here I …
Run Code Online (Sandbox Code Playgroud)

memory workspace r environment-variables

8
推荐指数
2
解决办法
147
查看次数

如何从R工作区中删除未被垃圾回收删除的不可见对象?

我正在使用mboost包中的blackboost函数来估计Windows 7 64位,8GB RAM机器上大约500mb数据集的模型.在执行期间,R几乎可以使用所有可用内存.计算完成后,即使在使用gc()调用垃圾收集或保存并将工作空间重新加载到新的R会话之后,仍然会将4.5gb以上的内容分配给R.使用.ls.objects(1358003)我发现所有可见对象的大小约为550mb.

gc()的输出告诉我大部分数据都在向量单元格中,虽然我不确定这意味着什么:

            used   (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells   2856967  152.6    4418719  236.0   3933533  210.1
Vcells 526859527 4019.7  610311178 4656.4 558577920 4261.7
Run Code Online (Sandbox Code Playgroud)

这就是我正在做的事情:

> memory.size()
[1] 1443.99
> model <- blackboost(formula, data = mydata[mydata$var == 1,c(dv,ivs)],tree_control=ctree_control(maxdepth = 4))
Run Code Online (Sandbox Code Playgroud)

......加载了一堆包...

> memory.size()
[1] 4431.85
> print(object.size(model),units="Mb")
25.7 Mb
> memory.profile()
     NULL      symbol    pairlist     closure environment     promise    language 
        1       15895      826659       20395        4234       13694      248423 
  special     builtin        char     logical     integer      double     complex 
      174        1572     1197774 …
Run Code Online (Sandbox Code Playgroud)

memory-management r

7
推荐指数
1
解决办法
779
查看次数

R stats - 分配大矩阵/ Linux时的内存问题

我已经阅读了几个关于R中内存问题的线程,我似乎无法找到解决问题的方法.

我在一个大数据集的几个子集上运行一种LASSO回归.对于某些子集,它运行良好,对于一些较大的子集,它不起作用,类型"无法分配大小为1.6Gb的向量"的错误.错误发生在代码的这一行:

example <- cv.glmnet(x=bigmatrix, y=price, nfolds=3)
Run Code Online (Sandbox Code Playgroud)

它还取决于"bigmatrix"中包含的变量数量.

我试用了R和R64用于Mac和R用于PC但最近在Linux上使用了更快的虚拟机,以为我会避免任何内存问题.它更好但仍有一些限制,即使memory.limit表示"Inf".

无论如何要做这项工作还是我必须在矩阵中删除一些变量或者采用较小的数据子集?

我已经读过R正在寻找一些连续的内存,也许我应该预先分配矩阵?任何的想法 ?

linux statistics memory-management r

6
推荐指数
1
解决办法
7728
查看次数

R的保留内存是分配数组大小的两倍

我发现了以下行为.假设我创建了以下多维数组:

spam = array(runif(96*48*60*360), dim = c(96,48,60,360))
Run Code Online (Sandbox Code Playgroud)

可以预测R应该使用多少内存,即(96*48*60*360)*4字节= 759.4 Mbyte.使用该lsos函数很好地确认了这一点(参见这篇文章):

> lsos()
         Type      Size PrettySize Rows Columns
spam    array 796262520   759.4 Mb   96      48
lsos function       776  776 bytes   NA      NA
Run Code Online (Sandbox Code Playgroud)

然而,R作为一个进程使用了​​更多的内存,大小只有两倍:

$ top | grep rsession
82:17628 hiemstra  20   0 1614m **1.5g** 8996 S  0.3 40.4   0:04.85 rsession  
Run Code Online (Sandbox Code Playgroud)

为什么R这样做?我假设分配额外的保留内存以使R更快速地访问?有什么想法吗?

memory-management r

6
推荐指数
1
解决办法
182
查看次数

在R和一般工作区管理中组合或合并工作空间

当一个计算系统处于停电/忙碌时,我经常发现自己将工作空间转移到不同的临时驱动器等,或者,我想同时运行两个长卷包以节省时间并在不同的地方加载两次相同的工作空间.

因此,我真的很喜欢一种方法来查看工作空间之间的不同对象和组合它们的方法,只将新的,更改的或更新的工作空间对象添加到类似的工作空间.这对我来说非常有用.

到目前为止,我依靠手工记笔记,并在两周后弄乱了我的涂鸦.我真的只是想学习如此优秀的工作实践和习惯,这使得这种方式变得更容易.

一般来说,我真的想了解更多关于工作空间管理的信息,以及经验丰富的用户如何为长期持续的项目保持工作空间的全面和整洁.我经常使用Rstudio但是远程工作或使用我们的HPC系统它有点滞后和笨重所以我倾向于使用命令行和交互式会话.

我想也许制作对象列表可能是关键,但我希望能够更容易地注释事物,可能使用用于制作对象的数据和参数等.

谢谢.

workspace r project

6
推荐指数
1
解决办法
3199
查看次数

获取可用数据框列表

如何获取当前环境中可用的数据框名称向量?我试过了:

sapply(ls(), is.data.frame)
Run Code Online (Sandbox Code Playgroud)

但这失败了因为ls返回字符串的向量.我打算使用此列表作为Shiny app中动态选择的输入.

r shiny

6
推荐指数
3
解决办法
7079
查看次数

调试R中不同源文件中的函数

我正在使用RStudio,我希望能够在特定的行停止代码执行.

这些函数在第一个脚本文件中定义,并从第二个脚本文件调用.

我使用第一个文件到第二个文件 source("C:/R/script1.R")

我使用从头到尾的运行:我从第二个脚本开始运行,该脚本具有函数调用,并在第一个脚本中突出显示了函数定义所在的行.

然后我browser()用来查看变量.然而,这并不理想,因为涉及一些大的矩阵.有没有办法让这些变量出现在RStudio的工作区中?

此外,当我从一行到另一行重新使用run时,它只运行到被调用的第一个脚本文件的末尾,它不会返回到调用函数并完成第二个文件的运行.

我怎样才能在RStudio中实现这些目标?

好的,这是一个简单的例子,下面的函数加法器在一个脚本中定义

adder<-function(a,b) {  
  browser()
  return(a+b)
 }
Run Code Online (Sandbox Code Playgroud)

我打电话来自第二个剧本

x=adder(3,4)
Run Code Online (Sandbox Code Playgroud)

在第二个脚本中调用adder时,在第一个脚本中启动browser().从这里我可以使用get("a")来获取a的值,但是a和b的值不会出现在RStudio的工作区中?

在这里的例子中它并不重要,但是当你有几个大矩阵时它确实如此.

r rstudio

5
推荐指数
1
解决办法
3073
查看次数

在网页抓取时只有小对象的高R内存使用率

我正在抓一个网站,并从for-loop调用我的抓取功能.在循环的4,000次迭代中,我的计算机警告我RStudio使用了太多的内存.但是在使用转义键断开循环之后,我在R环境中看不到任何大对象.

我尝试了这两个 帖子的提示,但他们没有透露原因.当我mem_used()从pryr包裹打电话时,我得到:

2.3 GB

这与Windows任务管理员最初所说的一致.它表示2.3 GB,然后在循环结束后十分钟内降至1.7 GB,在循环后二十分钟内降至1.2 GB. mem_used()继续说2.3 GB.

但根据lsos()上面链接的第一篇文章中的函数,我的R对象很小:

> lsos()
                       Type     Size  Rows Columns
all_raw              tbl_df 17390736 89485      12
all_clean            tbl_df 14693336 89485      15
all_no_PAVs          tbl_df 14180576 86050      15
all_no_dupe_names    tbl_df 13346256 79646      15
sample_in            tbl_df  1917128  9240      15
testdat              tbl_df  1188152  5402      15
username_res         tbl_df   792936  4091      14
getUserName        function   151992    NA      NA
dupe_names           tbl_df   132040  2802       3
time_per_iteration  numeric    65408  4073      NA
Run Code Online (Sandbox Code Playgroud)

这说我最大的对象是17 MB,不接近2.3 GB.我怎样才能找到内存使用的罪魁祸首并修复它?循环中是否存在逐渐占用内存的东西? …

memory r rvest

5
推荐指数
0
解决办法
395
查看次数

删除R中给定类型的所有对象

如何使用rm删除的所有对象某种类型的在R?

我目前有一堆定义的功能,我想要删除.

我知道ls有一个pattern选项,但这只有在我命名模式中的所有函数时才有用(我不是).

r

4
推荐指数
1
解决办法
1168
查看次数