[R-es] Cannot allocate vector of size

Marcelino de la Cruz marcelino.delacruz en upm.es
Mar Dic 22 19:41:07 CET 2015


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
>



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