Есть ли способ установить локали в кластере в г? - PullRequest
1 голос
/ 12 февраля 2020

Мне нужно запустить кусок кода, используя параллельную обработку, чтобы сократить время выполнения. Каждый шаг не зависит друг от друга. Я создал кластер,

 cl = makeCluster(cores)
 registerDoParallel(cl)
 invisible(clusterEvalQ(cl, sapply(list.files("./Src/LibrariesAndFunctions/",
                                             full.names = TRUE,
                                             recursive = TRUE),
                                  function(x) {
                                    source(x, encoding = "UTF-8")
                                  })))

Теперь мне нужно прочитать набор функций, доступных в том же каталоге. Проблема в том, что данные на японском языке, и я установил глобальную локаль за пределами кластера как

Sys.setlocale("LC_ALL","japanese_JAPAN")

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

2020/02/12 20:10:27.742   [INFO ]   2020/02/12 20:10:27.497   |main        |  [xxx] 結合 開始
Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
  4 nodes produced errors;irst error: ./Src/LibrariesAndFunctions//01_Setup_Logging_Milestone/I103_Setup.R:15:0: unexpected end of input
13:   ##
14:   ## 
   ^

Эта ошибка говорит о том, что в строке 14 произошел неожиданный конец ввода, но там есть японские комментарии. Это может быть решено, только если комментарии переведены на engli sh. Итак, мой вопрос здесь, как установить локаль в узле кластера?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Вы можете запустить произвольный код R на каждом узле кластера с помощью clusterEvalQ.

parallel::clusterEvalQ(cl, Sys.setlocale("LC_ALL","japanese_JAPAN"))
0 голосов
/ 14 февраля 2020

Я нашел решение этой проблемы. Решение заключается в следующем.

clusterCall(cl,function(){ Sys.setlocale("LC_ALL","japanese_JAPAN")})

Языковой стандарт был установлен в кластере.

...