Data.table: SHM-Größe überschritten Fehler

Erstellt am 14. Juli 2017  ·  3Kommentare  ·  Quelle: Rdatatable/data.table

Funktionsanfrage, überprüfen Sie die Größe von /dev/shm, um zu sehen, ob sie mit der mmap-Größe übereinstimmt. In meinem Fall habe ich R in einem Docker-Container verwendet und die Standardgröße für /dev/shm ist 64 MB. Wenn der Code ein mmap auf einem geleiteten Stream ausführt (z. B. mit hadoop fs -cat /myfile.csv), liest er nur die shm-Größenbytes aus der Pipe in mmap. Es meldet keinen Fehler über die C-API, von dem ich vermute, dass es normal ist. Das Debuggen, warum sich fread über das Dateiformat beschwerte, führte jedoch zu einem tiefen Eintauchen in den R- und C-Code von data.table, um festzustellen, dass dieser Mechanismus verwendet wird. Der gemeldete Fehler (zufällige Nachricht basierend darauf, wo meine Pfeife abgeschnitten wurde):

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

Dies kann wie folgt reproduziert werden:

  • Erstellen Sie eine Datei, die ~5 MB größer ist als /dev/shm
  • Passen Sie /dev/shm auf etwa 64 MB an (dies ist die Standardeinstellung für einen Docker-Container).
  • Führen Sie fread auf "cat ~/myfile.csv" aus <-- cat erstellt die Pipe
  • Docker V1.12+
  • Centos neuestes Image vom Docker-Hub
  • R-Open v3.4.0 (Microsoft)

Im Code: https://github.com/Rdatatable/data.table/blob/master/src/fread.c
Um Zeile 788 herum sollte es vielleicht die Größe von /dev/shm überprüfen, um zu sehen, ob sie mit der Datei übereinstimmt, die es gerade in den Speicher gelesen hat. In meinem Fall im Docker ist hier die ausführliche Ausgabe der fehlgeschlagenen Testbedingung:

 > 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

Erwartete Ergebnisse:

 File opened, filesize is 0.373524 GB.

Wenn es fehlschlägt, kennt es außerdem intern die Zeilennummer und andere nützliche Informationen, wenn es fehlgeschlagen ist. Ich musste den Wert von Hand auf Null setzen, bevor ich das Verbose-Flag entdeckte. Wäre schön, wenn normale Fehlermeldungen die Zeile # anzeigen würden. vebose=T zeigt den Ort an, wenn es die Anzahl der Trennzeichen berechnet, wie es für diesen Testfall eine nützliche Ausgabe bei einem Fehler gewesen wäre (da ich wusste, dass die Datei 20 Millionen Datensätze hatte):

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

Hilfreichster Kommentar

Leute, ich bin derjenige, der zUMIS/19 gemeldet hat. Ich habe Ihr dev 1.10.5 ausprobiert und es funktioniert perfekt. Tolle Arbeit Jungs!

Alle 3 Kommentare

Für alle, die dasselbe Problem finden, besteht die kurzfristige Lösung darin, die gemeinsam genutzte Speichergröße des Containers oder in Ihrem Betriebssystem zu erhöhen, wenn /dev/shm zu klein ist. Typische moderne Betriebssysteme verwenden 50 % Ihres verfügbaren Speichers. In meiner 64G-Amazon-EC2-Instanz habe ich den zu verwendenden Docker-Container eingestellt:

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

Einverstanden. Das tut mir leid.
Eine kürzliche Änderung in der Entwicklung ist dies aus den Nachrichten:

Ramdisk (/dev/shm) wird nicht mehr für die Ausgabe von Systembefehlseingaben verwendet. Obwohl es schneller war, wenn es funktionierte, verursachte es zu viele Geräte-Voll-Fehler; zB #1139 und zUMIs/19. Danke an Kyle Chung für die Berichterstattung. Standard tempdir() wird jetzt verwendet. Wenn Sie eine RAM-Disk verwenden möchten, setzen Sie TEMPDIR auf /dev/shm; siehe ?tempdir.

Bitte versuchen Sie dev 1.10.5 und öffnen Sie ein neues Problem, wenn das Problem weiterhin besteht.

Leute, ich bin derjenige, der zUMIS/19 gemeldet hat. Ich habe Ihr dev 1.10.5 ausprobiert und es funktioniert perfekt. Tolle Arbeit Jungs!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen