Data.table: Cambio de desarrollo R; R-API dentro de regiones paralelas

Creado en 30 nov. 2018  ·  4Comentarios  ·  Fuente: Rdatatable/data.table

Luke Tierney me contactó por un problema de memoria en R-devel. Las pruebas están pasando tanto en CRAN como en Travis / Appveyor, pero el uso de memoria es mayor en algunos casos. Como antes, el recolector de basura se apaga.
No estoy seguro de cuándo se realizó exactamente el cambio de R-devel, pero en algún momento del último mes más o menos. Puede ser que el cambio de R-devel cause el nuevo problema de memoria, o que el cambio de R-devel revele el problema que ya existe (posiblemente incluso con data.table-release en R-release). En cualquier caso, es necesario arreglarlo.

Luke escribió:

I distilled the issue in 'constellation' down to the attached file
from the examples. If I run this the memory usage is much bigger than
previously and the gc() output is garbled. It's a
multi-threading issue again; everything looks fine with
OMP_NUM_THREADS=1. With mutlipe threads you are
calling DATAPTR from threads other than the main one and that creates
a race on setting the R_GCEnabled flag, so eventually it is getting
stuck on off. I instrumented the places where the GC is disabled and
tracked this as the first one from a thread other than the main one:

#4  0x00007ffff78ba9d5 in DATAPTR (x=x@entry=0x1167458)
     at ../../../R/src/include/Rinlinedfuns.h:106
#5  0x00007fffea02c4c8 in subsetVectorRaw (target=0x4529590, source=0x1167458,
     idx=0x4175210, any0orNA=FALSE) at subset.c:44
#6  0x00007fffea02c7a6 in subsetDT (x=<optimized out>, rows=<optimized out>,
     cols=<optimized out>) at subset.c:272

Dados los detalles de Luke, es fácil ver el problema en el código sin necesidad de reproducirlo. Todo el uso de la API de R debe realizarse fuera de todas las regiones paralelas, como Luke solicitó anteriormente. Me retrasé en hacer eso la última vez debido a la presión del tiempo, y ahora hay que abordarlo. La última vez hice el primer paso que fue asegurarme de que DATAPTR dentro de las regiones paralelas no recibiera ALTREP.

Esto justifica la publicación acelerada de 1.12.0, sobre todo porque afecta a Luke.

$ grep "omp.*parallel" *.c

  • [x] subconjunto.c
  • [x] reordenar.c
  • [x] fwrite.c
  • [x] fread.c
  • [x] fsort.c
  • [x] forder.c
  • [x] entre.c

$ grep ALTREP *.c

  • [x] entre.c
  • [x] fsort.c
  • [x] reordenar.c
  • [x] envoltorios.c
R-devel bug

Comentario más útil

¡Increíble de Luke para hacer todo el trabajo duro de identificar la causa! 💯

Todos 4 comentarios

¡Increíble de Luke para hacer todo el trabajo duro de identificar la causa! 💯

Estoy en proceso de confirmar con Luke que está arreglado antes de cerrar ...

Confirmado fijo. Gracias a @ltierney por su ayuda.


Para completar en caso de que necesitemos volver a consultar ...
No pude reproducir el problema con R-devel compilado de la siguiente manera. (Necesitaba confirmar que podía reproducir el problema con 1.11.8 antes de poder confirmar que 1.11.9 lo soluciona).

./configure --without-recommended-packages --disable-byte-compiled-packages --enable-strict-barrier CC="gcc -fsanitize=address -fno-sanitize=float-divide-by-zero -fno-omit-frame-pointer" CFLAGS="-O0 -g -Wall -pedantic"

incluso con el guión que Luke proporcionó:

library(data.table)
library(constellation)
temp <- as.data.table(vitals[VARIABLE == "TEMPERATURE"])
pulse <- as.data.table(vitals[VARIABLE == "PULSE"])
resp <- as.data.table(vitals[VARIABLE == "RESPIRATORY_RATE"])
temp[, RECORDED_TIME := as.POSIXct(RECORDED_TIME,
  format = "%Y-%m-%dT%H:%M:%SZ", tz = "UTC")]
pulse[, RECORDED_TIME := as.POSIXct(RECORDED_TIME,
  format = "%Y-%m-%dT%H:%M:%SZ", tz = "UTC")]
resp[, RECORDED_TIME := as.POSIXct(RECORDED_TIME,
  format = "%Y-%m-%dT%H:%M:%SZ", tz = "UTC")]
gc()
for (i in 1:10) {
  cat("i=",i,"\n")
  b1 <- bundle(temp, pulse, resp,
    bundle_names = c("PLATELETS", "INR"), window_hours_pre = 24,
    window_hours_post = c(6, 6), join_key = "PAT_ID",
    time_var = "RECORDED_TIME", event_name = "CREATININE", mult = "all")
}
gc()

Como una posibilidad remota, recompillé R-devel de manera más simple de la siguiente manera, aún con --enable-strict-barrier que es lo importante:
./configure --without-recommended-packages --enable-strict-barrier
reinstaló constellation y todas sus dependencias y data.table 1.11.8, y esta vez el script de Luke falla correctamente:

Fatal error: Wrong thread calling 'RunFinalizers'

Instalar data.table-dev (1.11.9) en este R-devel y volver a ejecutarlo funciona bien. La reinstalación de data.table 1.11.8 falla nuevamente. De hecho, está arreglado por 1.11.9. En mi compilación R-devel original, tal vez algo estaba haciendo que 1.11.8 funcionara (deshabilitando el compilador de bytes, -00, ASAN, etc.). De todos modos, se necesitaba una compilación de R-devel más simple y valía la pena intentarlo.

@jangorecki Si el tiempo lo permite, sería genial agregar --enable-strict-barrier al R-devel usado en las canalizaciones de CI. No sé si compila R-devel o no para canalizaciones de CI.

@mattdowle sí, compilo R-devel diariamente,

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

Temas relacionados

mattdowle picture mattdowle  ·  3Comentarios

alex46015 picture alex46015  ·  3Comentarios

franknarf1 picture franknarf1  ·  3Comentarios

andschar picture andschar  ·  3Comentarios

st-pasha picture st-pasha  ·  3Comentarios