Data.table: Taille SHM dépassée Erreur

Créé le 14 juil. 2017  ·  3Commentaires  ·  Source: Rdatatable/data.table

Demande de fonctionnalité, vérifiez la taille de /dev/shm pour voir si elle correspond à la taille mmap. Dans mon cas, j'utilisais R dans un conteneur Docker et la taille par défaut pour /dev/shm est de 64M. Lorsque le code effectue un mmap sur un flux canalisé (comme avec hadoop fs -cat /myfile.csv), il ne lira que les octets de taille shm du canal dans mmap. Il ne signale pas d'erreur via l'API C, ce que je soupçonne d'être normal. Cependant, le débogage de la raison pour laquelle fread se plaignait du format de fichier a entraîné une plongée approfondie dans le code R et C de data.table pour découvrir qu'il utilise ce mécanisme. L'erreur signalée (message aléatoire basé sur l'endroit où mon tuyau a été coupé):

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

Ceci peut être reproduit en procédant comme suit :

  • Construisez un fichier d'environ 5 Mo de plus que /dev/shm
  • Ajustez le /dev/shm à quelque chose comme 64M (c'est la valeur par défaut pour un conteneur Docker)
  • Exécutez fread sur "cat ~/myfile.csv" <-- cat crée le tube
  • Docker V1.12+
  • Centos dernière image du docker hub
  • R-open v3.4.0 (microsoft)

Dans le code : https://github.com/Rdatatable/data.table/blob/master/src/fread.c
Autour de la ligne 788, il devrait peut-être vérifier la taille de /dev/shm pour voir s'il correspond au fichier qu'il vient de lire en mémoire. Dans mon cas, dans docker, voici la sortie détaillée de la condition de test ayant échoué :

 > 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

Résultats attendus:

 File opened, filesize is 0.373524 GB.

De plus, lorsqu'il échoue, il connaît en interne la ligne # et d'autres informations utiles lorsqu'il échoue. J'ai dû me concentrer sur la valeur à la main avant de découvrir le drapeau verbeux. Ce serait bien si les messages d'erreur normaux indiquaient la ligne #. vebose=T affiche l'emplacement lorsqu'il calcule le nombre de délimiteurs, comme pour ce cas de test, une sortie utile en cas d'erreur (puisque je savais que le fichier contenait 20 millions d'enregistrements):

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

Commentaire le plus utile

Les gars, c'est moi qui ai signalé zUMIS/19 . J'ai essayé votre dev 1.10.5 et cela fonctionne parfaitement. Excellent travail les gars !

Tous les 3 commentaires

Pour tous ceux qui rencontrent le même problème, la solution à court terme consiste à augmenter la taille de la mémoire partagée du conteneur ou de votre système d'exploitation si votre /dev/shm est trop petit. Les systèmes d'exploitation modernes typiques utilisent 50 % de votre mémoire disponible. Dans mon instance amazon ec2 64G, j'ai défini le conteneur docker à utiliser :

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

D'accord. Désolé pour ça.
Un changement récent dans le dev est celui-ci à partir des actualités :

Le disque RAM (/dev/shm) n'est plus utilisé pour la sortie de l'entrée de commande système. Bien que plus rapide lorsqu'il fonctionnait, il provoquait trop d'erreurs de périphérique plein ; par exemple, #1139 et zUMIs/19. Merci à Kyle Chung pour le signalement. Tempdir() standard est maintenant utilisé. Si vous souhaitez utiliser un disque RAM, définissez TEMPDIR sur /dev/shm ; voir ?tempdir.

Veuillez essayer dev 1.10.5 et ouvrir un nouveau problème si le problème persiste.

Les gars, c'est moi qui ai signalé zUMIS/19 . J'ai essayé votre dev 1.10.5 et cela fonctionne parfaitement. Excellent travail les gars !

Cette page vous a été utile?
0 / 5 - 0 notes