Интерактивно работать с объектами списка, которые занимают много памяти

Недавно я обнаружил чудеса пакетов bigmemory, ff и filehash для обработки очень больших матриц.

Как я могу обрабатывать очень большие (300 МБ++) списки? В своей работе я работаю с этими списками весь день каждый день. Я могу сделать временное решение с помощью save() и load() хаков везде, но я бы предпочел решение, подобное bigmemory. Что-то вроде bigmemory bigmatrix было бы идеальным, когда я работаю с ним в основном так же, как matrix, за исключением того, что он занимает около 660 байт в моей оперативной памяти.


Эти списки в основном представляют собой списки длиной >1000 из lm() объектов (или аналогичных объектов регрессии). Например,

Y <- rnorm(1000) ; X <- rnorm(1000)
A <- lapply(1:6000, function(i) lm(Y~X))
B <- lapply(1:6000, function(i) lm(Y~X))
C <- lapply(1:6000, function(i) lm(Y~X))
D <- lapply(1:6000, function(i) lm(Y~X))
E <- lapply(1:6000, function(i) lm(Y~X))
F <- lapply(1:6000, function(i) lm(Y~X))

В моем проекте у меня будут списки типа A,B,C,D,E,F (и даже больше), с которыми мне придется работать в интерактивном режиме.

Если бы это были гигантские матрицы, то была бы тонна поддержки. Мне было интересно, есть ли подобная поддержка в каком-либо пакете для больших объектов list.


person Jase    schedule 25.09.2012    source источник
comment
Вы спрашиваете совета о том, какой пакет использовать?   -  person GSee    schedule 25.09.2012
comment
Кажется, это слишком расплывчато, чтобы поддерживать рекомендации по передовой практике. Необходимо описать природу этих списков. Возможно, один из интерфейсов базы данных. Рекомендации по кодированию требуют лучшего описания задачи.   -  person IRTFM    schedule 25.09.2012
comment
Посмотрите на пакет SOAR?   -  person mnel    schedule 26.09.2012
comment
Вам нужно все содержимое объекта "lm"? Если бы нужны были, скажем, только коэффициенты, то можно было бы представить каждый список 'lm' объектов в виде матрицы. Также вы можете использовать более быстрый lm.fit: sapply(1:6000, function(i) coef(lm.fit(cbind(1, X), Y)))   -  person G. Grothendieck    schedule 26.09.2012
comment
@ G.Grothendieck Это хороший совет, который я возьму на вооружение. Однако я все же хотел бы получить решение вопроса для случаев объектов регрессии, таких как rq() и других подобных объектов, где этот тип решения недоступен.   -  person Jase    schedule 26.09.2012
comment
Попробуйте: sapply(1:3, function(i) coef(rq.fit(cbind(1, X), Y)))   -  person G. Grothendieck    schedule 26.09.2012
comment
Живя более опасно, вы также можете взломать подобранные объекты, чтобы стереть большие части (т. Е. Исходные данные обычно хранятся независимо в каждой регрессионной подгонке). Большинство методов доступа по-прежнему будут работать без данных, и при необходимости вы сможете восстановить данные в этом слоте. (Правда, это все еще не универсальный ответ на ваш вопрос, на который похоже, что ответ отрицательный.)   -  person Ben Bolker    schedule 23.10.2012
comment
Это очень хорошее псевдорешение!   -  person Jase    schedule 23.10.2012
comment
Это может быть кладж, но вы можете хешировать свои объекты с помощью пакета дайджеста и добавлять хешированные строки в Bigmatrix.   -  person Róisín Grannell    schedule 25.12.2012


Ответы (1)


Вы можете хранить и получать доступ к спискам на диске, используя filehash упаковка. Это должно работать (если довольно медленно на моей машине...):

Y <- rnorm(1000) ; X <- rnorm(1000)

# set up disk object
library(filehash)
dbCreate("myTestDB")
db <- dbInit("myTestDB")

db$A <- lapply(1:6000, function(i) lm(Y~X))
db$B <- lapply(1:6000, function(i) lm(Y~X))
db$C <- lapply(1:6000, function(i) lm(Y~X))
db$D <- lapply(1:6000, function(i) lm(Y~X))
db$E <- lapply(1:6000, function(i) lm(Y~X))
db$F <- lapply(1:6000, function(i) lm(Y~X))

Доступ к элементам списка можно получить с помощью функции [. Подробнее см. здесь: http://cran.r-project.org/web/packages/filehash/vignettes/filehash.pdf

person Ben    schedule 22.05.2013