我定期编程.好吧,我一直在编程,但有时会以内存错误的形式赶上我.我开始在使用rm()命令删除对象时执行一些纪律,事情变得更好.我在网上看到有关gc()在删除大型数据对象后是否应该显式调用的混合消息.有人说在R返回内存错误之前它会运行,gc()而其他人则说手动强制gc是一个好主意.
我应该gc()在删除大型对象后运行以确保最大的内存可用性吗?
我在R(在Windows下)运行我的代码,其中涉及大量的内存数据.我试图用来rm(list=ls())清理内存,但似乎内存仍然被占用,我无法重新运行我的代码.我试图关闭R并重新启动R,但它是一样的,似乎内存仍然被占用,因为当我运行代码它说它不能分配内存(但它可能在第一次).重新启动电脑后,内存似乎只清理了.
有没有办法清理内存,以便我可以重新运行我的代码而不必每次都重新启动我的电脑?
我正在进行大规模的机器学习,但是由于R内存占用,我的计算速度变慢了.
我清除了我的对象,我也尝试gc()了结果:
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 4460452 231.5 15288838 1116.6 36599071 1954.7
Vcells 29572776 349.4 324509788 2712.9 350796378 3376.4
Run Code Online (Sandbox Code Playgroud)
我的任务管理器显示R会话仍然分配超过3GB的内存,我的电脑仍然很慢.
如何释放R占用的内存?(我不想重启电脑)
我已经通过reticulate包使用一些python功能创建了一个函数,特别是使用PIL以下方法打开图像:
image <- "~/Desktop/image.jpg"
pil.image <- reticulate::import( "PIL.Image", convert = FALSE )
img <- pil.image$open( image )
Run Code Online (Sandbox Code Playgroud)
然后我用图像做了一些事情(我正在提取几种作物),这很好.这是我正在做的一个例子(outputs我需要的作物数据框,所以crop.grid只是4个数字的向量.
crop.grid <- c( outputs$x.start[x],
outputs$y.start[x],
outputs$x.stop[x],
outputs$y.stop[x] )
crop.grid <- as.integer( crop.grid )
crop.grid <- reticulate::r_to_py( crop.grid )
output.array <- img$crop( box = crop.grid )
output.array$save( output.filename )
Run Code Online (Sandbox Code Playgroud)
在此之后,我想从内存中清除图像(我正在打开的图像非常大,因此占用大量内存).我尝试在python中关闭图像:
img$close()
Run Code Online (Sandbox Code Playgroud)
和R一样:
rm( img )
gc()
Run Code Online (Sandbox Code Playgroud)
用我知道的非常小的东西替换物体.
img <- reticulate::r_to_py( 1L )
Run Code Online (Sandbox Code Playgroud)
所有这些都运行良好,但我的RAM仍然记录为非常充分.我用我创建的每个python对象尝试它们,但唯一能有效清除RAM的是重启R会话.
我知道python我最好打开图像with,以便在流程结束时清除它,但我不确定如何使用它reticulate.
---更新类似python版本:
如果我直接在python中执行上述操作:
from …Run Code Online (Sandbox Code Playgroud) 我知道有很多类似的问题都得到了公认的答案(这里,这里甚至这个),但到目前为止,我没有找到关于如何在不重新启动 R 会话的情况下释放一些内存空间的明确答案。
我知道,可以保存他的工作区,重新启动 R 并重新加载工作区,但是:
情况似乎并非如此。即使在删除了我工作区的一半最大对象(感谢这个很好的答案)并运行之后gc(),top仍然给我提供了完全相同的内存使用百分比。
这里的一个评论,它说:
R 的垃圾收集将 RAM 标记为可用。由您的操作系统来收回
听起来不错,但不确定这真的发生了。top即使在rm()和之后gc(),甚至在操作系统中启动新的其他进程之后,甚至在 2 小时、10 小时或 3 天之后,仍然向我显示 R 使用的相同数量的内存。
这个评论表明它必须查看加载的库和图形设备,但为什么呢?我该如何解决?
如果我rm()一个3GB对象然后gc()用来释放内存,R 怎么可能仍然使用相同百分比的内存?