Подтвердить что ты не робот

Превышение предела памяти в R (даже с 24 ГБ ОЗУ)

Я пытаюсь объединить два dataframes: один имеет 908450 наблюдений 33 переменных, а другой имеет 908450 наблюдений за 2 переменными.

dataframe2 <-merge(dataframe1, dataframe2, by="id")

Я очистил все остальные фреймы из рабочей памяти и reset лимит памяти (для совершенно нового рабочего стола с 24 ГБ ОЗУ) с помощью кода:

memory.limit(24576)

Но я все еще получаю сообщение об ошибке Cannot allocate vector of size 173.Mb.

Любые мысли о том, как обойти эту проблему?

4b9b3361

Ответ 1

Чтобы отслеживать мои комментарии, используйте 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 гигабайта. Когда я слился вместе, он прыгнул до 3.7 и выровнялся. Я думаю, вам будет трудно найти что-то большее, чем память или время, более эффективное.

До: enter image description here

После: enter image description here

Ответ 2

Насколько я могу судить о трех решениях:

  • Использовать datatables
  • Используйте память подкачки (можно настраивать на машинах * nix)
  • Использовать выборку