Большое слияние/управление памятью

Я наткнулся на стену, пытаясь объединить большой файл и меньший. У меня есть прочитайте много других сообщений об управлении памятью в R , и не смог найти неэкстремальный (перейти на 64-битную версию, загрузить в кластер и т. д.) метод ее решения. Я пробовал немного с пакетом bigmemory, но не смог найти решение. Я подумал, что попробую здесь, прежде чем разводить руками в отчаянии.

Код, который я запускаю, выглядит следующим образом:

#rm(list=ls())
localtempdir<- "F:/Temp/"
memory.limit(size=4095)
[1] 4095
    memory.size(max=TRUE)
[1] 487.56
gc()
         used (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 170485  4.6     350000   9.4   350000   9.4
Vcells 102975  0.8   52633376 401.6 62529185 477.1

client_daily<-read.csv(paste(localtempdir,"client_daily.csv",sep=""),header=TRUE)
object.size(client_daily)
>130MB

sbp_demos<-read.csv(paste(localtempdir,"sbp_demos",sep=""))
object.size(demos)
>0.16MB
client_daily<-merge(client_daily,sbp_demos,by.x="OBID",by.y="OBID",all.x=TRUE)
Error: cannot allocate vector of size 5.0 MB

Думаю, я спрашиваю, есть ли какие-нибудь умные способы обойти это, не связанные с покупкой нового оборудования?

  1. Мне нужно иметь возможность merge создать объект большего размера.
  2. Затем мне нужно будет делать регрессии и т. д. с этим большим объектом.

Должен ли я сдаться? Должна ли bigmemory помочь решить эту проблему?

Любое руководство с благодарностью.

Подробности: версия R 2.13.1 (08.07.2011) Платформа: i386-pc-mingw32/i386 (32-разрядная версия) Intel 2 Duo Core @2,33 ГГц, 3,48 ГБ ОЗУ


person Daniel Egan    schedule 21.12.2011    source источник
comment
Вы смотрели на data.table пакет? Это быстро для больших слияний, и по совпадению может быть более эффективным с точки зрения использования памяти для загрузки?   -  person Chase    schedule 22.12.2011
comment
Это, вероятно, не решит вашу проблему, но вот что вы можете попробовать. Если в любом наборе данных есть какие-либо столбцы, которые вам не нужны: удалите их после чтения данных, выполните gc(), а затем повторите попытку слияния. Другая идея состоит в том, чтобы преобразовать ваши данные в матрицу, если это возможно, так как они, как правило, занимают меньше памяти.   -  person Rguy    schedule 22.12.2011


Ответы (1)


Как уже упоминал Чейз, вы можете попробовать data.table или, возможно, sqldf.

Для любого из них вы, вероятно, получите больше сока, если правильно установите индексы.

С data.table вы бы:

dt1 <- data.table(sbp_demos, key='OBID')
dt2 <- data.table(client_daily, key='OBID')

## Do an INNER JOIN-like operation, where non-matching rows are removed
mi <- dt1[dt2, nomatch=0]

## Do a RIGHT JOIN(?)-like operation ... all rows in dt2 will be returned.
## If there is no matching row in dt1, the values in the dt1 columns for
## the merged row will be NA
mr <- dt1[dt2]

Если вы пойдете по пути sqldf, посмотрите пример 4i на его веб-сайте... еще раз, убедитесь, что вы правильно используете индексы. .

person Steve Lianoglou    schedule 21.12.2011