Data.table: Erro de tamanho SHM excedido

Criado em 14 jul. 2017  ·  3Comentários  ·  Fonte: Rdatatable/data.table

Solicitação de recurso, verifique o tamanho de /dev/shm para ver se ele corresponde ao tamanho do mmap. No meu caso, eu estava usando R dentro de um contêiner docker e o tamanho padrão para /dev/shm é 64M. Quando o código faz um mmap em um fluxo canalizado (como com hadoop fs -cat /meuarquivo.csv), ele apenas lerá os bytes de tamanho shm do canal para o mmap. Ele não relata um erro por meio da API C, o que eu suspeito que seja normal. No entanto, depurar por que fread reclamou do formato do arquivo resultou em um mergulho profundo no código R e C de data.table para descobrir que ele usa esse mecanismo. O erro relatado (mensagem aleatória com base em onde meu tubo foi cortado):

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

Isso pode ser reproduzido fazendo o seguinte:

  • Construa um arquivo que seja ~5 mega maior que /dev/shm
  • Ajuste o /dev/shm para algo como 64M (este é o padrão para um contêiner do Docker)
  • Execute fread em "cat ~/myfile.csv" <-- cat cria o pipe
  • Docker V1.12+
  • A imagem mais recente do Centos do docker hub
  • R-open v3.4.0 (microsoft)

No código: https://github.com/Rdatatable/data.table/blob/master/src/fread.c
Por volta da linha 788, talvez ele deva verificar o tamanho de /dev/shm para ver se ele corresponde ao arquivo que acabou de ler na memória. No meu caso, no docker, aqui está a saída detalhada da condição de teste com falha:

 > 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 esperados:

 File opened, filesize is 0.373524 GB.

Além disso, quando falha, conhece internamente a linha # e outras informações úteis quando falha. Eu tive que zerar o valor manualmente antes de descobrir o sinalizador detalhado. Seria bom se as mensagens de erro normais indicassem a linha #. vebose=T mostra a localização quando calcula o número de delimitadores, como para este caso de teste, teria uma saída útil em caso de erro (já que eu sabia que o arquivo tinha 20 milhões de registros):

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

Comentários muito úteis

Pessoal, fui eu que denunciei o zUMIS/19 . Eu tentei seu dev 1.10.5 e funciona perfeitamente. Ótimo trabalho galera!

Todos 3 comentários

Para quem encontrar esse mesmo problema, a correção de curto prazo é aumentar o tamanho da memória compartilhada do contêiner ou em seu sistema operacional se seu /dev/shm for muito pequeno. Os sistemas operacionais modernos típicos usam 50% da memória disponível. Na minha instância do amazon ec2 de 64G, configurei o contêiner docker para usar:

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

Acordado. Me desculpe por isso.
Uma mudança recente no dev é esta de notícias:

O disco Ram (/dev/shm) não é mais usado para a saída da entrada do comando do sistema. Embora mais rápido quando funcionava, estava causando muitos erros completos no dispositivo; por exemplo, #1139 e zUMIs/19. Obrigado a Kyle Chung por relatar. O tempdir() padrão agora é usado. Se você deseja usar o disco ram, defina TEMPDIR para /dev/shm; veja ?tempdir.

Por favor, tente o dev 1.10.5 e abra um novo problema se ainda for um problema.

Pessoal, fui eu que denunciei o zUMIS/19 . Eu tentei seu dev 1.10.5 e funciona perfeitamente. Ótimo trabalho galera!

Esta página foi útil?
0 / 5 - 0 avaliações