我想在内存中创建一个包含 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) 我试图找出哪些对象在我的 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) 我正在使用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) 我已经阅读了几个关于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正在寻找一些连续的内存,也许我应该预先分配矩阵?任何的想法 ?
我发现了以下行为.假设我创建了以下多维数组:
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更快速地访问?有什么想法吗?
当一个计算系统处于停电/忙碌时,我经常发现自己将工作空间转移到不同的临时驱动器等,或者,我想同时运行两个长卷包以节省时间并在不同的地方加载两次相同的工作空间.
因此,我真的很喜欢一种方法来查看工作空间之间的不同对象和组合它们的方法,只将新的,更改的或更新的工作空间对象添加到类似的工作空间.这对我来说非常有用.
到目前为止,我依靠手工记笔记,并在两周后弄乱了我的涂鸦.我真的只是想学习如此优秀的工作实践和习惯,这使得这种方式变得更容易.
一般来说,我真的想了解更多关于工作空间管理的信息,以及经验丰富的用户如何为长期持续的项目保持工作空间的全面和整洁.我经常使用Rstudio但是远程工作或使用我们的HPC系统它有点滞后和笨重所以我倾向于使用命令行和交互式会话.
我想也许制作对象列表可能是关键,但我希望能够更容易地注释事物,可能使用用于制作对象的数据和参数等.
谢谢.
如何获取当前环境中可用的数据框名称向量?我试过了:
sapply(ls(), is.data.frame)
Run Code Online (Sandbox Code Playgroud)
但这失败了因为ls返回字符串的向量.我打算使用此列表作为Shiny app中动态选择的输入.
我正在使用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的工作区中?
在这里的例子中它并不重要,但是当你有几个大矩阵时它确实如此.
我正在抓一个网站,并从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.我怎样才能找到内存使用的罪魁祸首并修复它?循环中是否存在逐渐占用内存的东西? …
如何使用rm删除的所有对象某种类型的在R?
我目前有一堆定义的功能,我想要删除.
我知道ls有一个pattern选项,但这只有在我命名模式中的所有函数时才有用(我不是).