wintarcy
有时候在R上运行数据,会出错,如
"无法分配大小为20.0 Mb的矢量"
处理大规模数据很容易出现这种错误
请问有没有什么好的处理方法? 能不能介绍一些关于R底层内存分配的一些资料 或者 是如何写一些更加
优化的R语句?
rtist
搜索一下老贴以及夏天的R会议内容
然后还得具体问题具体分析
wintarcy
利用affy包中的ReadAffy读取cel格式的基因芯片表达数据
结果一直出错,如下
错误: 无法分配大小为920.0 Mb的矢量
我命令行 --max-men-size = 4000M (R自动改为2G) 或者 用 memory.limit(4000) 始终解决不了问题
一直都是到920.0M就分配不了了
我的机器是 xp professional + 2G内存
rtist
一次读一张
wintarcy
我考虑一次读几张 可以完成 但是我不知道如何把几个affy对象合成为一个affy对象
因为我想对里面的数据进行标准化
wintarcy
找了非常多的内容 总算解决了
用affy包里的justRMA 直接读取并标准化为expressionset对象 不用转换为AffyBatch
突然觉得R的内存处理很奇怪 有时候挺好的 有时候就很怪 justRMA之所以可以处理是因为justRMA调用的是C写的函数, C对内存的控制可以很经准.
R官方的文档对于内存的利用的解释非常的少, 在用R处理大规模数据的时候是非常容易出现内存分配不了的情况, 最直接的方法就是命令行 --max-men-size = **M 或者 用 memory.limit(**) [推荐前者]
这只是告诉R,希望它预留出一块内存以供使用, 很多时候看到直接用memory.limit(4000) , R直接就返回NULL,虽然当你再用memory.limit查询的时候已经变为4000,其实R根本不可能用到4000M的内存, 应该解释为希望R预留更多的空间 (xp操作系统应该是只能支持最大2G内存).
但有的时候这个也不好使,尽管我们期望R尽可能的使用我们已有的内存空间,但是你必须考虑操作系统是否给你足够空间,以及操作系统本身对内存的处理方式,还有当前所运行的其他的进程. 因此很多人把此类问题归于操作系统的问题.
就拿自己举例子,我用的是xp操作系统,2G内存. 开完机器后只剩下1.5G左右, 接着就运行R程序 直到出现错误 "无法分配大小为920.0 Mb的矢量", 用memory.size(TRUE)查了一下大概930多M, 说明目前R能用的空间为930M左右, 操作系统就不再给R更多的空间了. 有些人认为,1.5G内存空间可被R利用的空间大概为700多M,推算,那么2G的内存也就差不多是900多M. 但是R官方资料说明2G内存中,R可以利用到1.5G左右,剩下0.5G给其他进程使用. 可我不管用什么方法都只有900多M. 不过文档中还说明, R所用的空间需要连续的, 由于windowsxp操作系统的内存经常出现碎片致使R可利用的空间远远下于1.5G (不同的时候运行同一个R程序,有时候会出错有时候就不会出错,估计就是这个问题)
我觉得现在内存处理的问题还是挺多的, R在内存处理上采用的pass by value的形式 直接决定R需要消耗大量的内存( 估计是为了让R用起来更简单), 这使得R在内存优化方面绝对是很弱的, 许多用于大规模数据的算法不得不从算法本身进行更多的优化,以弥补R在内存上处理的缺陷. 当然R有相应的内存回收机制, 昨天运行了一个接近一个小时的R程序, 看这内存的波动情况 感觉R的内存处理上(回收)还是很好的.
R文档里还提到的是 cons size 以及 varian size ,后者很好理解就是为可变变量分配在堆中的空间大小, 而cons size 我就不知道了. 可以在命令行中分别设置这两种变量的最小值与最大值, 不过不知道这些值得设定会不会对问题有所解决我还不知道.
有的时候遇到这类内存上的问题,没法解决,最后只好用更好的机器.
[以上仅代表自己的一些看法,如有错误希望指正, 谢谢]
eagle_7621
非常谢谢!
rtist
Dealing with large data set is essentially the problem for ANY language.
momozilla
[quote]引用第5楼wintarcy于2007-10-30 08:56发表的“”:
找了非常多的内容 总算解决了
用affy包里的justRMA 直接读取并标准化为expressionset对象 不用转换为AffyBatch
突然觉得R的内存处理很奇怪 有时候挺好的 有时候就很怪 justRMA之所以可以处理是因为justRMA调用的是C写的函数, C对内存的控制可以很经准.
R官方的文档对于内存的利用的解释非常的少, 在用R处理大规模数据的时候是非常容易出现内存分配不了的情况, 最直接的方法就是命令行 --max-men-size = **M 或者 用 memory.limit(**) [推荐前者]
这只是告诉R,希望它预留出一块内存以供使用, 很多时候看到直接用memory.limit(4000) , R直接就返回NULL,虽然当你再用memory.limit查询的时候已经变为4000,其实R根本不可能用到4000M的内存, 应该解释为希望R预留更多的空间 (xp操作系统应该是只能支持最大2G内存).
.......[/quote]
赞认真精神!
如果数据实在是大得不行,用R确实是件痛苦的事,建议使用S-Plus 7.0以上版本。2005年发布的S-PLUS 7.0 增加了一个 BigData library(软件启动时会自动加载),由此甚至可以处理比内存容量还要大的数据,不过就是得有耐心,那些数据在内存和硬盘之间倒腾要花些时间的
rtist
[quote]引用第8楼momozilla于2007-11-01 16:39发表的“”:
如果数据实在是大得不行,用R确实是件痛苦的事,建议使用S-Plus 7.0以上版本。2005年发布的S-PLUS 7.0 增加了一个 BigData library(软件启动时会自动加载),由此甚至可以处理比内存容量还要大的数据,不过就是得有耐心,那些数据在内存和硬盘之间倒腾要花些时间的
.......[/quote]
Yes. That's why I say it's a problem for essentially any language.
In fact, you can do such things in R also, as in the ff package does.
mmx-plus
SPLUS 7.0 BigData library 也没有好到哪里去! 临时硬盘文件往往比数据文件文本身大好几倍。
大数据的话,SAS 挺好的,但就是太贵了
momozilla
[quote]引用第10楼mmx-plus于2007-11-07 15:36发表的“”:
SPLUS 7.0 BigData library 也没有好到哪里去! 临时硬盘文件往往比数据文件文本身大好几倍。
大数据的话,SAS 挺好的,但就是太贵了[/quote]
我没提SAS,是考虑到程序的可移植性
与重新学一种语言相比,那点硬盘空间的代价实在微不足道
另,你知道SAS或者SPSS的临时文件搁在哪儿,它们有多大?
haiyanwu
momozilla,我的经验是用linux跑,同样配置的机器比windows下的R要好很多。主要是操作系统的内存管理机制问题。前几天跑了一次30张affymetrix 60K 芯片,vista下根本不行,转到我们的linux sever上读取用了不到1分钟,归一化也才用了几分钟,所以我的建议是你装个linux,然后把交换区分大一些。
momozilla
[quote]引用第12楼haiyanwu于2007-11-09 02:20发表的“”:
momozilla,我的经验是用linux跑,同样配置的机器比windows下的R要好很多。主要是操作系统的内存管理机制问题。前几天跑了一次30张affymetrix 60K 芯片,vista下根本不行,转到我们的linux sever上读取用了不到1分钟,归一化也才用了几分钟,所以我的建议是你装个linux,然后把交换区分大一些。[/quote]
这可真是个好消息!你不说,我还真没注意到这个区别
较大的数据都是在服务器上处理,是Windows系统。另外也因为是那些大型的数据保密级较高,按规定只能在单位里使用(还得签使用协议)。有时在家里笔记本的Debian上运行模型,可能是因为数据较小,所以也没有感觉出太大的差别。不过,真感谢你的提示,又学会一着,呵呵