作者Wush978 (拒看低质媒体)
看板R_Language
标题Re: [问题] 记忆体不足
时间Sat Jun 22 21:39:24 2013
※ 引述《lianhua (莲华)》之铭言:
: [问题类型]:
: 程式谘询
: [软体熟悉度]:
: 使用者
: [问题叙述]:
: 因为我需要跑大量的贝氏模拟,大回圈次数500次
: 大回圈里面的小回圈20000次
: 每一次小回圈都需要生成一个5XM (M大概100左右) 的矩阵
: 但是我的电脑大回圈大概都跑个200次左右就会跳出
: 错误: 无法配置大小为 526.2 Mb 的向量
: 这种讯息 请问是我的电脑记忆体不足,还是语法太拙劣?
理论上演算法需要的记忆体,都是可以事先评估出来的。
我先假设你回圈中生成的矩阵都要保留在记忆体。
一个numeric value需要 8 bytes 的记忆体空间,
这样的话,一个小回圈需要 500 * 8 bytes 的空间,大约 4 kb。
一个大回圈要20000 次小回圈,所以就是 80000 kb ,大约是 80 mb。
500次大回圈需要 40000 mb, 大约是 40 Gb 的记忆体。
你的电脑有这麽多记忆体嘛?
或是你需要保留每次生成的矩阵嘛?有没有确实清理掉?
另外R 在记忆体的使用上还有另外一个问题:
(请看下面的说明)
: [程式范例]:
: 程式很长,所以仅贴部分
: N = 500
: L0 = numeric()
: L1 = numeric()
: L2 = numeric()
: Alpha1 = numeric()
: Alpha2 = numeric()
: for(k in 1:N){
: set.seed(k)
: .
: .
: .
: 这里是我怀疑出错的部分,因为如果我不是生成随机矩阵的话
: 就不会有这个问题
: iter = 20000
: repeat{
: ### step 1 fill up Z ###
: g1 = function(x){
: ((l1+l0)*c1*(x^(c1-1)))/((l1+l0)*c1*(x^(c1-1))+l2*c2*(x^(c2-1)))
: }
: g2 = function(x){
: (l1*c1*(x^(c1-1)))/(l1*c1*(x^(c1-1))+(l2+l0)*c2*(x^(c2-1)))
: }
: Z1 = matrix(,ncol=2,nrow=length(t1))
: Z2 = matrix(,ncol=2,nrow=length(t2))
: for(i in 1:length(t1)){
: Z1[i,] = rmultinom(1,1,c(g1(t1[i]),(1-g1(t1[i]))))
: }
: for(i in 1:length(t2)){
: Z2[i,] = rmultinom(1,1,c(g2(t2[i]),(1-g2(t2[i]))))
: }
: }
使用 Z1[i,] = xxx
这种语法时,R 会复制记忆体,也就是你可能需要Z1两倍的记忆体,
所以如果Z1很大的话,也是会出问题。
: 想请各位先进为我解答,感谢~
你可以把你的需求写的更清楚,这样我还可以针对你的问题提供建议喔。
--
欢迎到ptt R_Language版分享R 的相关知识
欢迎加入 Taiwan R User Group :
http://www.facebook.com/Tw.R.User
聚会报名
http://www.meetup.com/Taiwan-R/
聚会影片
https://www.youtube.com/user/TWuseRGroup
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.224.201.62
※ 编辑: Wush978 来自: 61.224.201.62 (06/22 21:39)
1F:推 lin15:不知道W大对R处理大型资料库(记忆体吃不下)有没有甚麽建议? 06/22 23:20
2F:→ clickhere:不要只用一台机器处理. 06/23 01:32
3F:推 lianhua:感谢大大解答,那我要怎麽确实清理记忆体呢? 06/23 07:34
4F:→ lianhua:我生成的矩阵只有在一次的小回圈里有用下一次就是新的了 06/23 07:35
5F:推 lianhua:就是一个大回圈20000个矩阵只有在各自的回圈里会用到。 06/23 07:38
6F:→ celestialgod:你就把生成的矩阵rm掉 再加个gc()吧 06/23 07:47
7F:→ celestialgod:在大回圈的最後 06/23 07:48
8F:→ Wush978:通常名字盖掉会自己gc 耶,会不会问题不在这? :Q 06/23 10:45
9F:→ Wush978:你可以用object.size来看物件所占用的记忆体 06/23 10:45
10F:→ celestialgod:好像是rm才不会清记忆体...原PO可能需要PO程式 06/23 14:03
11F:→ celestialgod:才知道要怎样修改 06/23 14:03