Message-ID: <CADg83ee_afhBAcGh3+kWPxEnOQdBHCNjOX2BRC+h6bYi9Pr-eg@mail.gmail.com>
Date: 2015-12-22T17:26:37Z
From: Carlos J. Gil Bellosta
Subject: [R-es] Cannot allocate vector of size
In-Reply-To: <567924FE.3050509@gmail.com>
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