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:
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
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!
Comentario más útil
Chicos, soy el que reportó zUMIS/19 . He probado tu dev 1.10.5 y funciona perfectamente. ¡Gran trabajo chicos!