Skip to content

[R-es] Cannot allocate a vector of size...

11 messages · Carlos J. Gil Bellosta, Xavier-Andoni Tibau Alberdi, miri@m@@iz@te m@iii@g oii u@@v@rr@@es +2 more

#
Buenas tardes,

Estoy haciendo un análisis de contenido con el paquete tm. A la hora de
ejecutar este código:
 tdm<-TermDocumentMatrix(corpus,control=list(weighting =weightTf))
 tdm.reviews.m<-as.matrix(tdm)

La primera línea sí me la ejecuta bien pero en la segunda tengo este error:
Error: cannot allocate vector of size 14.0 Gb

¿Cómo puedo corregirlo? Estoy usando la versión de 64bits de R.

Un saludo

Miriam
#
Significa que tus datos són muy grandes y no se pueden guardar en la RAM.
Tienes alternativas para dividir la matriz?

El vie., 7 feb. 2020 17:26, <miriam.alzate en unavarra.es> escribió:

  
  
#
Es la primera vez que trabajo con este tipo de datos...No se si se puede
dividir esa matriz. ¿Cómo lo podría hacer?

Muchas gracias!
El Vie, 7 de Febrero de 2020, 17:55, Xavier-Andoni Tibau Alberdi escribió:
#
La primera matriz es sparse y la segunda no. Tal vez puedas continuar
dentro del universo de tm eliminando términos irrelevantes antes de
construir una matriz no completa. O tal vez puedas construir una matriz
sparse directamente.

El vie., 7 feb. 2020 17:26, <miriam.alzate en unavarra.es> escribió:

  
  
#
Depende de la operació que quieras hacer con la matriz. Si quitas filas y
columnas en algun momento, quiza lo puedes hacer por bloques y luego la
juntas.  O quizá puedes cargarlo directamente como data.frame? Quanta RAM
tienes? Cuanto pésan los datos?





El vie., 7 feb. 2020 18:04, <miriam.alzate en unavarra.es> escribió:

  
  
2 days later
#
Buenas,
El archivo de R ocupa 33 megas. La matriz que quiero construir cupa 14 gb.
En el disco local (C) tengo 400 gb disponibles de 670.
No estoy muy puesta en trabajar con este tipo de datos. ¿Qué diferencia es
trabajar con data.frame?

Gracias!

El Vie, 7 de Febrero de 2020, 18:07, Xavier-Andoni Tibau Alberdi escribió:
#
La respuesta de Carlos creo que es mucho mas acertada que la mía. Cuando
trabajas con una matriz mayoritariamente con 0s, puedes representar-la en
forma de sparse matrix, y ocupa mucho menos espacio porque no guardas todos
los valores, sino aquellos distintos de 0 y su posición.

Estas construyendo la matriz sparse con esto:
 tdm<-TermDocumentMatrix(corpus,control=list(weighting =weightTf))

puedes ver aquí
<https://www.rdocumentation.org/packages/tm/versions/0.7-7/topics/TermDocumentMatrix>
la documentación.

Al hacer esto, conviertes la matrz sparse a matriz normal y pones en
memoria todos los 0s, que ahora ocupan espacio en la memoria volátil (RAM)
de tu ordenador.
tdm.reviews.m<-as.matrix(tdm)

Estamos hablando de memoria RAM, no del disco duro de tu ordenador.

Entiendo que tal y como sugiere Carlos, (1) lo mejor es que antes de pasar
de sparse matrix a matriz normal, consideres en reducir la cantidad de
columnas (o filas) de tu matriz. Imagino que es una matriz con frecuencias
de palabras, a lo mejor puedes eliminar aquellas columnas que representen
términos muy poco usados. O (2) sigas usando la sparse matrix para tu
analisis.

Espero que se entienda y te sirva de ayuda,

Saludos,

Xavier Tibau



Missatge de l'adreça <miriam.alzate en unavarra.es> del dia dl., 10 de febr.
2020 a les 16:05:

  
  
#
Muchas gracias Xabier.

He intentaddo trabajar con la sparse matrix pero al pasar tdm a matriz me
dice también que "cannot allocate a vector of size 12 gb".
He hecho tdm<-as.matrix(tdm)

¿Está bien hecho eso para trabajar con la sparse matrix?

Gracias!

El Lun, 10 de Febrero de 2020, 16:15, Xavier-Andoni Tibau Alberdi escribió:
#
Me temo que no tengo demasiada experiencia en trabajar con sparse matrix en
R. Definitivamente cuando haces 'as.matrix(x)' estas convirtiendo x en una
matriz normal, no sparse. He visto que existe el paquete slam para trabajar
con ellas (documentación
<https://www.rdocumentation.org/packages/slam/versions/0.1-47>). Deberías
ver si las opciones del paquete te permiten hacer lo que quieres.

Faltaría más información de que haces luego con la matriz, para poder saber
si es posible dividir-la. Te pongo un ejemplo, si quieres calcular el valor
promedio de las columnas, puedes dividir la matriz en dos, calcularlos por
separado y luego juntar los resultados. Pero si tu matriz sirve para hacer
una regresión lineal, no puedes, puesto que necesitas la inversa de la
matriz y no se puede calcular a partir de dos mitades.

A ver si con el paquete slam puedes continuar, sino deberías compartir que
haces luego con la matriz para que podamos intentar aconsejarte.

Saludos,

Xavier Tibau

Missatge de l'adreça <miriam.alzate en unavarra.es> del dia dl., 10 de febr.
2020 a les 16:56:

  
  
#
Hola Miriam,

Puedes hacer varias cosas para salir al paso:

   - El flujo proceso que se suele seguir en este tipo de análisis es el de
   cargar todos los documentos a una gran matriz (documento/palabra) sobre la
   que luego te quitas muchas palabras "inútiles" (las stopwords). Pues lo que
   puedes hacer de primeras, es sobre tus ficheros de palabras de entrada
   limpiarles y quitarles estas palabras (preposiciones, artículos y
   adverbios) con esto minimizas mucho el número de palabras a representar.
   También habrá palabras que en tu tipo de análisis significarán poco (me lo
   invento la palabra "producto" por ejemplo).
      - ¿Cómo limpio esto en mis ficheros?. Puedes hacerlo con cierta
      facilidad utilizando comandos de linux (grep, sed en particular).
      - Una vez que has limpiado todo esto, puedes volver a probar a cargar
      el nuevo fichero en "tm" y proceder con el análisis. Si es que tu memoria
      RAM (no el disco como te han dicho) es la suficiente.
      - Realmente, si estás interesada en conocer la frecuencia de palabras
         para luego pintar una "inútil" nube de palabras, puedes
incluso calcular la
         frecuencia de aparición igualmente con un comando de linux (unique). Y
         luego usar el paquete "wordcloud2" para pintar la nubecita. :-).
      - Como alternativa, como supongo que querrás analizar sentimiento, y
   estas cosa o incluso ver POS cambiaría de tercio y no usaría "tm" me
   pasaría a la librería "udpipe" o en su defecto a la librería (tidytext) del
   que Julia Silge (su autora, tiene su libro de cómo usar su librería en
   abierto:
   https://www.tidytextmining.com/tidytext.html#the-unnest_tokens-function).


Saludos,
Carlos Ortega
www.qualityexcellence.es



El lun., 10 feb. 2020 a las 17:20, Xavier-Andoni Tibau Alberdi (<
xavitibau en gmail.com>) escribió:

  
    
#
Estimada Miriam Alzate

Creo que casi todos pasamos por un problema semejante, por las dudas ¿usted
utiliza alguna librería para realizar el análisis o se encuentra
escribiendo desde cero utilizando matrices? Un matemático puede explicarlo
mucho mejor, pero cuándo yo comencé a ver matrices transpuestas, y varias
en modelos muy semejantes a los modelos mixtos, encontré una cantidad de
requerimientos de memoria impresionantes, luego me aprendí que matriz común
solo es útil cuándo los datos son pocos, a nivel industrial no hay
computadora que pueda. Seguramente si utiliza algún paquete este contempla
el problema y automáticamente trabaja sobre la memoria. ¿Utilizo algo como
lo siguiente (copio y pego)?
library(Matrix)
A <- as(regMat, "sparseMatrix") # see also `vignette("Intro2Matrix")`
B <- Matrix(regMat, sparse = TRUE) # Thanks to Aaron for pointing this out
identical(A, B)
Javier Rubén Marcuzzi

El lun., 10 feb. 2020 a las 16:05, Carlos Ortega (<cof en qualityexcellence.es>)
escribió: