Data.table: Tamaño de SHM excedido Error

Creado en 14 jul. 2017  ·  3Comentarios  ·  Fuente: Rdatatable/data.table

Solicitud de funciones, verifique el tamaño de /dev/shm para ver si coincide con el tamaño de mmap. En mi caso, estaba usando R dentro de un contenedor docker y el tamaño predeterminado para /dev/shm es 64M. Cuando el código hace un mmap en una secuencia canalizada (como con hadoop fs -cat /myfile.csv), solo leerá los bytes de tamaño shm de la canalización en mmap. No informa un error a través de la API de Ca, lo que sospecho que es normal. Sin embargo, la depuración de por qué fread se quejó del formato de archivo resultó en una inmersión profunda en el código R y C de data.table para descubrir que usa este mecanismo. El error informado (mensaje aleatorio basado en dónde se cortó mi tubería):

 (ERROR):Expected sep (',') but ' ' ends field 0 when detecting types from point 10: 14183667

Esto se puede reproducir haciendo lo siguiente:

  • Cree un archivo que tenga ~5 megas de tamaño que /dev/shm
  • Ajuste /dev/shm a algo así como 64M (este es el valor predeterminado para un contenedor Docker)
  • Ejecute fread en "cat ~/myfile.csv" <-- cat crea la tubería
  • Ventana acoplable V1.12+
  • Imagen más reciente de Centos de docker hub
  • R-open v3.4.0 (microsoft)

En el código: https://github.com/Rdatatable/data.table/blob/master/src/fread.c
Alrededor de la línea 788, tal vez debería verificar el tamaño de /dev/shm para ver si coincide con el archivo que acaba de leer en la memoria. En mi caso, en la ventana acoplable, aquí está el resultado detallado de la condición de prueba fallida:

 > dat.df3<-fread("/opt/cloudera/parcels/CDH/bin/hadoop fs -cat /user/tcederquist/tim_pop_comm_14_5 | head -3668850" ,sep=",", header=TRUE, verbose=TRUE)
 Input contains no \n. Taking this to be a filename to open
 File opened, filesize is 0.062500 GB.
 Memory mapping ... ok
 ....basic output
 Type codes (point  8): 1111
 Type codes (point  9): 1111
 (ERROR):Expected sep (',') but ' ' ends field 0 when detecting types from point 10: 14183667

Resultados previstos:

 File opened, filesize is 0.373524 GB.

Además, cuando falla conoce internamente el # de línea y otra información útil cuando falló. Tuve que concentrarme en el valor a mano antes de descubrir la bandera detallada. Sería bueno si los mensajes de error normales indicaran la fila #. vebose=T muestra la ubicación cuando calcula el número de delimitadores, ya que para este caso de prueba habría sido una salida útil en caso de error (ya que sabía que el archivo tenía 20 millones de registros):

 Count of eol: 3668839 (including 0 at the end)
 nrow = MIN( nsep [11006514] / (ncol [4] -1), neol [3668839] - endblanks [0] ) = 3668838
fread

Comentario más útil

Chicos, soy el que reportó zUMIS/19 . He probado tu dev 1.10.5 y funciona perfectamente. ¡Gran trabajo chicos!

Todos 3 comentarios

Para cualquiera que encuentre este mismo problema, la solución a corto plazo es aumentar el tamaño de la memoria compartida del contenedor o en su sistema operativo si su /dev/shm es demasiado pequeño. Los sistemas operativos modernos típicos usan el 50% de su memoria disponible. En mi instancia 64G amazon ec2 configuré el contenedor docker para usar:

 docker run --shm-size="30g" ... other stuff ...

Acordado. Lo siento por eso.
Un cambio reciente en desarrollo es este de noticias:

El disco RAM (/dev/shm) ya no se usa para la salida de la entrada de comandos del sistema. Aunque más rápido cuando funcionaba, estaba causando demasiados errores de dispositivos completos; por ejemplo, #1139 y zUMIs/19. Gracias a Kyle Chung por informar. Ahora se usa tempdir() estándar. Si desea utilizar un disco RAM, establezca TEMPDIR en /dev/shm; ver ?tempdir.

Pruebe dev 1.10.5 y abra un nuevo problema si todavía es un problema.

Chicos, soy el que reportó zUMIS/19 . He probado tu dev 1.10.5 y funciona perfectamente. ¡Gran trabajo chicos!

¿Fue útil esta página
0 / 5 - 0 calificaciones