Data.table: Изменение R-devel; R-API внутри параллельных регионов

Созданный на 30 нояб. 2018  ·  4Комментарии  ·  Источник: Rdatatable/data.table

Люк Тирни связался со мной по поводу проблемы с памятью в R-devel. Тесты проходят как CRAN, так и Travis / Appveyor, но в некоторых случаях используется больше памяти. Как и раньше выключается сборщик мусора.
Не уверен, когда именно было внесено изменение в R-devel, но где-то в прошлом месяце или около того. Возможно, изменение R-devel вызывает новую проблему с памятью или изменение R-devel обнаруживает проблему, которая уже существует (возможно, даже с data.table-release в R-release). В любом случае это нужно исправить.

Лука писал:

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

Учитывая детали Люка, легко увидеть проблему в коде без необходимости воспроизводить. Все использование R API требует выхода за пределы всех параллельных регионов, как ранее просил Люк. Я откладывал это в последний раз из-за нехватки времени, и теперь над этим нужно бороться. В прошлый раз я только что сделал первый шаг, который должен был гарантировать, что DATAPTR внутри параллельных регионов не получит ALTREP.

Это гарантирует ускоренный выпуск 1.12.0, не в последнюю очередь потому, что это влияет на Люка.

$ grep "omp.*parallel" *.c

  • [x] subset.c
  • [x] reorder.c
  • [x] fwrite.c
  • [x] fread.c
  • [x] fsort.c
  • [x] forder.c
  • [x] между.c

$ grep ALTREP *.c

  • [x] между.c
  • [x] fsort.c
  • [x] reorder.c
  • [x] wrappers.c
R-devel bug

Самый полезный комментарий

Великолепно, что Люк проделал всю тяжелую работу по выявлению причины! 💯

Все 4 Комментарий

Великолепно, что Люк проделал всю тяжелую работу по выявлению причины! 💯

Я собираюсь подтвердить Люку, что это исправлено перед закрытием ...

Подтверждено исправлено. Спасибо @ltierney за его помощь.


Для полноты картины, если нам нужно вернуться назад ...
Я не смог воспроизвести проблему с R-devel, скомпилированным следующим образом. (Мне нужно было подтвердить, что я могу воспроизвести проблему с 1.11.8, прежде чем я смогу подтвердить, что 1.11.9 исправляет ее.)

./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"

даже со сценарием, который предоставил Люк:

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()

В общем, я перекомпилировал R-devel более простым образом, как показано ниже, все еще с --enable-strict-barrier что является важным:
./configure --without-recommended-packages --enable-strict-barrier
переустановил constellation и все его зависимости и data.table 1.11.8, и на этот раз сценарий Люка не работает правильно:

Fatal error: Wrong thread calling 'RunFinalizers'

Установка data.table-dev (1.11.9) в этот R-devel и повторный запуск работает нормально. Переустановить data.table 1.11.8 снова не удается. Так что это действительно исправлено в 1.11.9. В моем исходном компиляции R-devel, возможно, что-то заставляло работать 1.11.8 (отключение байтового компилятора, -00, ASAN и т. Д.). В любом случае, была нужна более простая компиляция R-devel, и ее стоило попробовать.

@jangorecki Если позволяет время, было бы здорово добавить --enable-strict-barrier в R-devel, используемую в конвейерах CI. Я не знаю, компилируете ли вы R-devel для конвейеров CI или нет.

@mattdowle да я компилирую R-devel ежедневно, добавлю туда этот флаг. Добавлено в # 3147, чтобы не забыть

Была ли эта страница полезной?
0 / 5 - 0 рейтинги