Параллельные вычисления в R с функциями C-in-R с использованием пакета снегопада. Проблема: Mac показывает загрузочные колеса и почти зависает

У меня есть пакет R, который содержит функцию C-in-R с именем myFun. Я хотел бы назвать это myFun в своих параллельных вычислениях. Этот myFun отлично работает сам по себе на моем Mac, однако, когда он вызывается через параллельную вычислительную функцию sfClusterApplyLB, он показывает странное поведение: мой Mac показывает загрузочные диски и R почти замерзает. Через некоторое время R останавливается, и sfClusterApplyLB возвращает распараллеленные результаты. Я действительно хочу избежать этого условия замораживания, поскольку я не могу даже прокручивать вверх / вниз по консоли R, когда он замерзает!

Чтобы проиллюстрировать это, у меня есть небольшой пример кода.

У меня есть небольшой код C, который петли 100 раз, при распечатке количества итераций каждые 20 секунд и спящего 1 с на каждой итерации:

# include  # include  # include  # include  # include  SEXP myC (SEXP j) { for (int i = 0; i < 100; i++) { R_FlushConsole(); R_ProcessEvents(); R_CheckUserInterrupt(); sleep(1); // sleep one second at each iteration. this sleep is // replaced by something in my code if (i%20==0) Rprintf("\v%d iterations are done...",i); } return (R_NilValue); } 

Я создал временный R-пакет «myRpack», который содержит эту функцию myC, а также ее функцию-оболочку myFun, которая определяется как:

  myFun <- function(x) { .Call("myC", as.integer(x), "myRpack") } 

«myRpack» был установлен на мой Mac с помощью команды R CMD INSTALL myRpack в терминале.

Эта функция myCfun отлично работает, когда она запускается независимо. Видеть,

  library(myRpack) myFun(1) 

Теперь, я хочу, чтобы параллельно вычислить этот myFun, используя пакет снегопада. Для этого используется R-код для параллельных вычислений:

  library("snowfall") sfInit(parallel=TRUE,cpus=3,type="SOCK") x <- 1 : 100 res.list <- sfClusterApplyLB(x,myFun) то  library("snowfall") sfInit(parallel=TRUE,cpus=3,type="SOCK") x <- 1 : 100 res.list <- sfClusterApplyLB(x,myFun) 

Тогда R замерзает!

PS Я испытал эту проблему некоторое время назад, когда выполнял функцию C-in-R (без параллельных вычислений). Я задал этот вопрос Rcpp: Mac показывает загрузочное колесо и почти замораживает . Решение о том, чтобы добавить строки

  R_FlushConsole(); R_ProcessEvents(); R_CheckUserInterrupt(); 

в моем файле C (что я и сделал в моем коде). Однако это решение не помогает в параллельной вычислительной среде …

Буду признателен за любую помощь.

PSS Даже если я определяю функцию myC как:

 # include  # include  # include  # include  # include  SEXP myC (SEXP j) { const int input=INTEGER(j)[0]; Rprintf("\n input %d",input); for (int i = 0; i < 100; i++) { R_FlushConsole(); R_ProcessEvents(); R_CheckUserInterrupt(); sleep(1); // sleep one second at each iteration. this sleep is // replaced by something in my code if (i%20==0) Rprintf("\v%d iterations are done...",i); } return (R_NilValue); } 

Проблема присутствует.

Я столкнулся с той же проблемой и наткнулся на обходное решение, которое может или не может работать в вашем случае.

tl; dr: Я понял, что скрипты, которые я запускал, которые вызывали функции с использованием низкоуровневого кода C параллельно, которые зависали в R GUI, выполнялись бы должным образом в экземпляре R в терминале (один раз за каждый последующий source() будут зависать).


Больше фона, для тех, кто сталкивается с одной и той же проблемой: я столкнулся с этим, вызвав функцию gbm.step() пакет demo параллельно. Я использовал пакеты doParallel и foreach для его распараллеливания. Функция gbm.step () – функция C, которая подходит для моделей с усиленной регрессионной древовидной структурой, и когда я буду запускать ее параллельно, она замерзнет (при проверке большинство использования ЦП было System, а не User).

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

(Мое окончательное решение заключалось в том, чтобы запустить этот код на сервере Linux, поэтому возьмите его за то, что он стоит.)

В вашей функции myC

SEXP myC (SEXP j) {

Не следует ли «j» преобразовать где-нибудь в переменную C?