2012-07-19 199 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機器可調)
  • 使用採樣