超过R中的内存限制(即使使用24GB RAM)
我想合并两个数据框:一个有908450个观察33个变量,另一个有908450个观察2个变量。超过R中的内存限制(即使使用24GB RAM)
dataframe2 <-merge(dataframe1, dataframe2, by="id")
我使用的代码清除从工作内存中的所有其他dataframes,并重置我的内存限制(与24 GB的RAM一个全新的桌面):
memory.limit(24576)
但是,我m仍然收到错误Cannot allocate vector of size 173.Mb
。
有关如何解决此问题的任何想法?
要请按照我的意见,使用data.table
。我列举了一个与您的数据相匹配的快速示例来说明:
library(data.table)
dt1 <- data.table(id = 1:908450, matrix(rnorm(908450*32), ncol = 32))
dt2 <- data.table(id = 1:908450, rnorm(908450))
#set keys
setkey(dt1, id)
setkey(dt2, id)
#check dims
> dim(dt1)
[1] 908450 33
> dim(dt2)
[1] 908450 2
#merge together and check system time:
> system.time(dt3 <- dt1[dt2])
user system elapsed
0.43 0.03 0.47
所以它花了不到1/2秒来合并在一起。我在截图前后看了我的记忆。在合并之前,我使用了3.4公里的ram。当我合并在一起时,它跳到3.7并且平息。我想你会很难找到更多的内存或时间效率。
前:
后:
你好 - 快速的问题。我使用'dat1_table roody 2012-07-19 17:09:42
@roody - 这很奇怪。我只是使用上面的例子进行测试,先使用data.frames,然后使用您的方法转换为data.tables。我无法重现错误。你确定'data1'和'data2'实际上是data.frames吗?你可以用'class()',或者'str()'或者'is.data.frame()'来检查。你也可以尝试在一个命令中设置data.table,例如'dt Chase 2012-07-19 17:18:34
Hi Chase - 显然是一个日期时间变量数据集正在破坏事物。这一切都奏效了!非常感谢! – roody 2012-07-19 17:33:06
至于我能想到的有三种解决方案:
- 使用数据表
- 使用交换内存(可在* nix机器可调)
- 使用采样
包'data.table'可以更高效的内存和很多很多比'data.frames',因为它使数据的副本少快。 – Chase 2012-07-19 16:03:04
你真的使用24 Gb,并且相关,是你的os 64位吗? – 2012-07-19 16:06:21
操作系统必须能够将所需数量的连续内存分配给R.因此,您可能会受到其他正在运行的应用程序的限制。 – James 2012-07-19 16:13:09