在使用服务器或者集成开发环境过程中,不可避免会遇到内存溢出的问题。所以内存管理的好坏直接决定了数据分析的效率,本篇将从实际场景出发,分享内存优化的关键技巧与实践,让你的工作流畅无阻!
实例内存监测
在跑大任务之前,用户端可以查看自己的实例所在的服务器是否有足够的内存,在天意云官网可以看到不同服务器情况和内存配置,用户可以自行切换,选择时段内最优配置跑任务。
如果内存剩余过低,可以登录服务器,使用命令如top、free -h检查内存消耗最多的进程。如果某些进程占用大量内存但并非必要,可以使用kill -9命令终止这些进程,释放部分内存。如果不及时处理,实例内存溢出会导致卡死,长时间超出套餐限制使用资源,系统会强制停止实例,届时未保存的数据会丢失。
Rstudio解决内存溢出与卡顿
自定义函数减少无用变量的残留
不定义函数的情况:
#不定义函数的情况
n <- 10^9
a <- matrix(1,n) #大内存对象1
b <- matrix(1, n) #大内存对象2
#计算a和b的和,并将结果存储在c中
c <- a + b
定义函数的情况:
#定义函数的情况
n<-10^9
memory_efficient_sum<-function(n){
a<-matrix(1,n)#大内存对象1
b<-matrix(1,n)#大内存对象2
c<-a+b#计算a和b的和
return(c)#返回结果
}
#调用函数,并传入n
c <-memory_efficient_sum(n)#这里传入的是变量n的值
在定义的函数memory_efficient_sum中,矩阵a和b是局部变量,它们只在函数执行期间存在。一旦函数执行完毕并返回结果,这些局部变量就不再被引用,因此它们所占用的内存可以被垃圾回收器回收。
通过定义一个函数,我们可以在函数内部处理所有内存密集型操作,而不需要在全局环境中保留这些大型对象的引用。这样做的好处是,函数执行完毕后,局部变量会被自动清理,从而释放内存。
Rstudio使用建议
1、运行gc()函数手动清理内存垃圾
2、关闭Rstudio注意
3、Rstudio打不开
进入天意云官网点击清理Rstudio会话:
还可以top -u shpc_xxx (shpc_xxx改成你自己的用户名)这样看看rsession是否一直在加载数据,或者执行watch free -m命令观察内存变化情况,如果内存使用量一直增加,建议进行等待。如果等到内存不再变化后,页面还是在loading的状态,可以使用浏览器无痕模式访问Rstudio,看看是不是前端页面卡住了。
如果等了很久,都不行的话,可以尝试杀掉对应的进程,然后重新登录
# 获取进程号
ps -ef | grep "/usr/lib/rstudio-server/bin/rsession -u $(whoami)" | grep -v grep
# 杀掉进程:将123换成上一步得到的进程号 -9是固定的值,不要动(下面还有一行,是grep进程,无需理会,只需要关注红色框的进程)
kill -9 123
# 上述两条命令实现的功能也可以使用下面这一条命令来实现
ps -ef | grep "/usr/lib/rstudio-server/bin/rsession -u $(whoami)" | grep -v grep | awk '{print $2}' | xargs kill -15
Jupyter占用内存高问题排查解决
ps -ef | grep 进程号
重启
下期内容
本系列下一节更新“加速服务器数据的下载与上传”的内容