[R-es] Cannot allocate vector of size

Ruben Bermad ruben_bm en hotmail.com
Mie Dic 23 11:58:15 CET 2015


Antes de nada, me gustaría daros las gracias por toda vuestra ayuda.
He estado probando todo lo que me habéis dicho a la vez, y no hay manera, sigo teniendo el problema con el espacio. 
En cuanto al tamaño de la base de datos, es más grande de lo que puse, me equivoqué y puse el tamaño de una base anterior con la que estuve trabajando, la actual tiene 36866 filas x 6500 columnas.
He seguido todas vuestras recomendaciones (combinándolas) en diferentes dispositivos y sistemas operativos, pero no hay manera. De hecho el último intento fue haciendo los siguientes pasos en un sistema operativo Linux, con R 64 bits y en un servidor con 65Gb de RAM. 
1) He convertido la base de datos en una matriz "sparse" cuyo tamaño pasa de una matriz de 861.2Mb a una matriz de 10.2Mb
2) He eliminado todo lo que no es necesario de la función beta.pair dejándola en:library (betapart) # para que cargue la función betapart.core()
beta.pair <- function(x, index.family="sorensen"){       # test for a valid index     index.family <- match.arg(index.family, c('jaccard','sorensen'))           # test for pre-existing betapart objects       if (! inherits(x, "betapart")){         x <- betapart.core(x)         }           # run the analysis given the index       switch(index.family,                  sorensen = {                    beta.sim <- x$min.not.shared                                        pairwise <- list(beta.sim=as.dist(beta.sim))},                                    jaccard = {                    beta.jtu <- (x$min.not.shared)                                          pairwise <- list(beta.jtu=as.dist(beta.jtu))})           return(pairwise)          }
3) He ejecutado la función.matriz_distancias <- beta.pair (sparse_matrix, index.family="sorensen")
Y tras todos estos pasos me sigue dando el problema. Creo que ya solo me queda probar con los paquetes de R para gestión de Big Data como ff o bigmemory. 
¿Sabéis si las matrices que se guardan como bigmemory pueden manipularse con las mismas funciones que el resto?En concreto quiero saber si voy a poder calcular la matriz de distancias con beta.pair, y hacer un análisis cluster tipo UPGMA sobre esa matriz (la función agnes () o hclust()).
Saludos, Rubén

> From: dirienzo.julio en gmail.com
> Date: Tue, 22 Dec 2015 17:31:03 -0300
> To: marcelino.delacruz en upm.es
> CC: r-help-es en r-project.org
> Subject: Re: [R-es] Cannot allocate vector of size
> 
> Si las matrices tiene gran cantidad de ceros, es posible reducir
> sustancialmente la memoria utilizada cambiando las matrices convencionales
> por matrices sparse (library(Matrix))
> 
> Dr. Julio Di Rienzo
> Estadística y Biometría
> FCA- U.N. Córdoba
> http://sites.google.com/site/juliodirienzo
> 
> 
> El 22 de diciembre de 2015, 15:41, Marcelino de la Cruz <
> marcelino.delacruz en upm.es> escribió:
> 
> > Yo creo que el problema principal está en betapart.core(), que crea y
> > mantiene simultáneamente en memoria varios objetos de alrededor de 1 Gb que
> > luego combina en una lista... Probablemente es entre las líneas el código
> > de betaper.core donde hay que ir eliminando objetos.
> >
> > Saludos,
> >
> > Marcelino
> >
> >
> > El 22/12/2015 a las 18:26, Carlos J. Gil Bellosta  escribió:
> >
> >> Hola, ¿qué tal?
> >>
> >> Yo no entré a comentar lo que hacen ni beta.pair ni betapart.core, que
> >> es la función a la que esta llama. Pero tanto la una como la otra
> >> hacen puras operaciones de álgebra lineal (sobre todo betapart.core).
> >> Esas operaciones deberían ser muy livianas en términos de uso de
> >> memoria. El objeto resultante no deberia ocupar más de 1GB (una matriz
> >> 11k x 11k).
> >>
> >> Así que si conviertes tus datos de entrada a matriz (en lugar de DF),
> >> borras el DF y haces un gc() (para borrar el objeto grande enseguida)
> >> y operas con con esa matriz, es fácil que no tengas problemas. ¡No
> >> deberías tenerlos!
> >>
> >> Un saludo,
> >>
> >> Carlos J. Gil Bellosta
> >> http:///www.datanalytics.com
> >>
> >>
> >>
> >>
> >>
> >>
> >> El día 22 de diciembre de 2015, 11:25, Francisco Rodriguez Sanchez
> >> <f.rodriguez.sanc en gmail.com> escribió:
> >>
> >>> Hola Rubén,
> >>>
> >>> Totalmente de acuerdo con los consejos de Carlos. Ten en cuenta que
> >>> aunque R
> >>> disponga de varios (bastantes) GB de memoria, algunos de los objetos que
> >>> va
> >>> creando durante el proceso pueden consumirla por completo. Es decir, que
> >>> aunque tu ordenador tenga 64GB de RAM, es posible que no queden 10 GB
> >>> libres
> >>> para almacenar un objeto (porque ya hay demasiados objetos grandes en la
> >>> memoria).
> >>>
> >>> Sinceramente, más que intentar implementar los análisis en python 'de
> >>> novo',
> >>> creo que lo mejor es optimizar el código de R para evitar consumir toda
> >>> la
> >>> memoria. Por ejemplo, si miras el código de la función beta.pair del
> >>> paquete
> >>> betapart (pegado más abajo), verás que crea 3 objetos (beta.sim,
> >>> beta.sne, y
> >>> beta.sor) que probablemente son muy grandes. Y luego los convierte a cada
> >>> uno en matriz de distancias (as.dist). En estas operaciones se te va la
> >>> memoria, pues todos estos objetos están almacenados ahí.
> >>>
> >>> Por tanto, una solución fácil sería calcular cada una de estas cosas de
> >>> una
> >>> en una, y acto seguido almacenarla en disco y reiniciar R (o gestionar la
> >>> memoria, con gc, etc, mira http://adv-r.had.co.nz/memory.html). Cuando
> >>> ya lo
> >>> tengas todo en disco puedes ir cargando objetos conforme los vayas
> >>> necesitando. Si son demasiado grandes para leerlos, puedes usar el
> >>> paquete
> >>> ff y similares. Un manual muy bueno para big data en R:
> >>> https://github.com/Robinlovelace/R-for-Big-Data.
> >>>
> >>> Así pues, desgranando y ejecutando una a unas las operaciones que
> >>> ejecuta la
> >>> función beta.pair, creo que puedes solucionar tu problema. O al menos eso
> >>> espero!
> >>>
> >>> Mucha suerte
> >>>
> >>> Paco
> >>>
> >>>
> >>>
> >>> beta.pair <- function(x, index.family="sorensen"){
> >>>
> >>>      # test for a valid index
> >>>      index.family <- match.arg(index.family, c('jaccard','sorensen'))
> >>>
> >>>      # test for pre-existing betapart objects
> >>>      if (! inherits(x, "betapart")){
> >>>          x <- betapart.core(x)
> >>>      }
> >>>
> >>>      # run the analysis given the index
> >>>      switch(index.family,
> >>>          sorensen = {
> >>>              beta.sim <- x$min.not.shared / (x$min.not.shared + x$shared)
> >>>              beta.sne <- ((x$max.not.shared - x$min.not.shared) / ((2 *
> >>> x$shared) + x$sum.not.shared)) * (x$shared / (x$min.not.shared +
> >>> x$shared))
> >>>              beta.sor <- x$sum.not.shared / (2 * x$shared +
> >>> x$sum.not.shared)
> >>>
> >>>              pairwise <- list(beta.sim=as.dist(beta.sim),
> >>> beta.sne=as.dist(beta.sne),beta.sor=as.dist(beta.sor))},
> >>>          jaccard = {
> >>>              beta.jtu <- (2*x$min.not.shared) / ((2*x$min.not.shared) +
> >>> x$shared)
> >>>              beta.jne <- ((x$max.not.shared - x$min.not.shared) /
> >>> (x$shared +
> >>> x$sum.not.shared)) * (x$shared / ((2*x$min.not.shared) + x$shared))
> >>>              beta.jac <- x$sum.not.shared / (x$shared + x$sum.not.shared)
> >>>
> >>>              pairwise <- list(beta.jtu=as.dist(beta.jtu),
> >>> beta.jne=as.dist(beta.jne),beta.jac=as.dist(beta.jac))})
> >>>
> >>>      return(pairwise)
> >>>
> >>> }
> >>>
> >>> El 21/12/2015 a las 20:32, Carlos J. Gil Bellosta escribió:
> >>>
> >>>>
> >>>> Hola, ¿qué tal?
> >>>>
> >>>> Haz tres cosas:
> >>>>
> >>>> 1) Prueba con subconjuntos de tus datos más pequeños: 1k, 2k, etc. a ver
> >>>> si
> >>>> funciona.
> >>>> 2) Mientras tanto, vigila el uso de memoria de tu máquina. En
> >>>> particular,
> >>>> los del proceso R.
> >>>> 3) Usa object.size para ver cuánto ocupan esos objetos que vas creando.
> >>>>
> >>>> Con eso verás dónde están los límites. Puede que la función beta.part no
> >>>> sea muy eficiente en términos de uso de la memoria. Los objetos que
> >>>> estás
> >>>> creando deberían ocupar menos de 5GB.
> >>>>
> >>>> En un sistema operativo normal y moderno deberías poder usar toda la RAM
> >>>> disponible. Usa (2) para ver cuánto come tu proceso de R.
> >>>>
> >>>> Un saludo,
> >>>>
> >>>> Carlos J. Gil Bellosta
> >>>> http://www.datanalytics.com
> >>>>
> >>>> El 21 de diciembre de 2015, 11:08, Ruben Bermad <ruben_bm en hotmail.com>
> >>>> escribió:
> >>>>
> >>>> Hola a tod en s,
> >>>>> Soy nuevo en R-help-es, por lo que perdonadme si debería haber mandado
> >>>>> este email a una sección en particular.
> >>>>> Quería consultaros un error que me aparece en R al hacer una matriz de
> >>>>> disimilitud a partir de una tabla con 6000 columnas x 11000 filas. El
> >>>>> mensaje que da R es "cannot allocate vector of size 10Gb", y me resulta
> >>>>> extraño ya que tengo 64 Gb de RAM disponible.
> >>>>> He estado leyendo en los foros y manuales de R que si trabajo en una
> >>>>> máquina de 64 bits sea Windows o Linux R no debería de tener un límite
> >>>>> para
> >>>>> ubicar un objeto, y que debería de usar toda la memoria física y
> >>>>> virtual
> >>>>> disponible, pero creo que no está siendo así.
> >>>>> Por ello quisiera preguntaros si vosotros sabéis como puedo ampliar la
> >>>>> memoria disponible (si este fuera de verdad el problema) o cómo puedo
> >>>>> ubicar el vector en el disco y que no use la RAM.
> >>>>> En concreto estoy intentando usar la función "beta.pair" del paquete
> >>>>> "betapart"
> >>>>> (https://cran.r-project.org/web/packages/betapart/betapart.pdf)
> >>>>> sobre la matriz de 6000x11000. Es en este punto donde R me da el
> >>>>> mensaje
> >>>>> de
> >>>>> error.
> >>>>> Después me gustaría ejecutar la función "agnes" del paquete "cluster" o
> >>>>> la
> >>>>> función "hclust" del paquete "stats" sobre dicha matriz de
> >>>>> disimilitud, y
> >>>>> supongo que tendré un problema similar.
> >>>>> El código exacto que he usado es:library(betapart)data_base # Base de
> >>>>> datos de 6000 columnas x 11000 filasdistance <- beta.pair (data_base,
> >>>>> index.family="sorensen") # Calculo de la matriz de disimilitud
> >>>>> beta_similarity <- distance$beta.sim # Selecciono el tipo de medida que
> >>>>> quiero
> >>>>> library(cluster)UPGMA<- agnes (beta_similarity ) # Análisis UPGMA
> >>>>>
> >>>>> Soluciones que he intentado: Ante los problemas que he tenido, he
> >>>>> intentado hacer la matriz de disimilitud en python. El problema es que
> >>>>> no
> >>>>> hay una función optimizada para la medida de disimilitud que quiero
> >>>>> estimar
> >>>>> (índice de simpson), y he tenido que escribir un código para que haga
> >>>>> los
> >>>>> cálculos por pares, pero va a tardar más de 8 días (y es un análisis
> >>>>> que
> >>>>> tengo que repetir muchas veces y no me parece muy viable).  Por ello
> >>>>> vuelvo
> >>>>> a R para intentar buscar una solución con el manejo de esta gran base
> >>>>> de
> >>>>> datos.
> >>>>> Os agradecería cualquier tipo de ayuda.
> >>>>> Muchas gracias por adelantado,
> >>>>> Un cordial saludo, Rubén
> >>>>>
> >>>>>
> >>>>>           [[alternative HTML version deleted]]
> >>>>>
> >>>>>
> >>>>> _______________________________________________
> >>>>> R-help-es mailing list
> >>>>> R-help-es en r-project.org
> >>>>> https://stat.ethz.ch/mailman/listinfo/r-help-es
> >>>>>
> >>>>>          [[alternative HTML version deleted]]
> >>>>
> >>>> _______________________________________________
> >>>> R-help-es mailing list
> >>>> R-help-es en r-project.org
> >>>> https://stat.ethz.ch/mailman/listinfo/r-help-es
> >>>>
> >>>
> >>>
> >>> --
> >>> Dr Francisco Rodriguez-Sanchez
> >>> Integrative Ecology Group
> >>> Estacion Biologica de Doñana - CSIC
> >>> Avda. Americo Vespucio s/n
> >>> 41092 Sevilla (Spain)
> >>> http://bit.ly/frod_san
> >>>
> >>>
> >>> _______________________________________________
> >>> R-help-es mailing list
> >>> R-help-es en r-project.org
> >>> https://stat.ethz.ch/mailman/listinfo/r-help-es
> >>>
> >>
> >> _______________________________________________
> >> R-help-es mailing list
> >> R-help-es en r-project.org
> >> https://stat.ethz.ch/mailman/listinfo/r-help-es
> >>
> >>
> > _______________________________________________
> > R-help-es mailing list
> > R-help-es en r-project.org
> > https://stat.ethz.ch/mailman/listinfo/r-help-es
> >
> 
> 	[[alternative HTML version deleted]]
> 
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
 		 	   		  
	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es