2012-07-19 193 views
17

我想合并两个数据框:一个有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

有关如何解决此问题的任何想法?

+4

包'data.table'可以更高效的内存和很多很多比'data.frames',因为它使数据的副本少快。 – Chase 2012-07-19 16:03:04

+2

你真的使用24 Gb,并且相关,是你的os 64位吗? – 2012-07-19 16:06:21

+0

操作系统必须能够将所需数量的连续内存分配给R.因此,您可能会受到其他正在运行的应用程序的限制。 – James 2012-07-19 16:13:09

回答

21

要请按照我的意见,使用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并且平息。我想你会很难找到更多的内存或时间效率。

前: enter image description here

后:enter image description here

+0

你好 - 快速的问题。我使用'dat1_table <-data.table(data1)'和'dat2_table <-data.table(data2)'将两个数据框都更改为数据表。但是,当我尝试设置密钥时,出现错误:“列2的长度为9,与列1的长度不同”。然而,使用'dim()'的行数似乎相同。 – roody 2012-07-19 17:09:42

+0

@roody - 这很奇怪。我只是使用上面的例子进行测试,先使用data.frames,然后使用您的方法转换为data.tables。我无法重现错误。你确定'data1'和'data2'实际上是data.frames吗?你可以用'class()',或者'str()'或者'is.data.frame()'来检查。你也可以尝试在一个命令中设置data.table,例如'dt < - data.table(yourDF,key =“yourKey”)' – Chase 2012-07-19 17:18:34

+0

Hi Chase - 显然是一个日期时间变量数据集正在破坏事物。这一切都奏效了!非常感谢! – roody 2012-07-19 17:33:06

2

至于我能想到的有三种解决方案:

  • 使用数据表
  • 使用交换内存(可在* nix机器可调)
  • 使用采样