Работа со средами в параллельном пакете в R - PullRequest
1 голос
/ 12 марта 2019

У меня есть R API, который использует 5 разных R файлов, которые определяют разные метрики, которые я использую.У каждого из этих файлов есть ряд задач, которые я запускаю с использованием параллельного пакета, поскольку все они используют одни и те же данные, но с разными группировками.Чтобы избежать необходимости создавать и закрывать кластеры в каждом файле, я вынул эти команды и поместил их в файл cluster.R.Таким образом, у меня есть в основном структура:


cluster.R -

cl <- makeCluster(detectCores() - 1)

clusterEvalQ(computeCluster, {
    library(‘dplyr’)
    source(‘helpers.R’)
})

.Last <- function() {
    stopCluster(cl)
}

Metric1.R - ​​

metric1.function <- function(x,y,z) {
    dplyr transformations
}

some_date <- date_from_api_input

tasks <- list(job1 = function() {metric1.function(data, grouping1, some_date)},
    job2 = function() {metric1.function(data, grouping2, some_date)},
    job3 = function() {metric1.function(data, grouping3, some_date)}
)

clusterExport(cl, c('data', 'metric1.function', 'some_date'), envir = environment())

out <- clusterApplyLB(
    cl,
    tasks,
    function(f) f()
)

bind_rows(out)

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

Метрика 2-5 одинакова, за исключением того, что пользовательская функция отличается для каждого файла и определяется в начале каждого файла.У меня проблема в том, что все метрики также запускаются параллельно, и у меня возникают проблемы при работе со средами.В итоге происходит то, что задание скажет, что some_date не найден или что metric2.function не найдена в metric5.R.

Я использую plumber, чтобы выставить R, и каждый раз, когда он запускается, он получает источникифайл cluster.R, запускает кластеры с их инициализацией и прослушивает любые поступающие запросы.

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

Должен ли я структурировать его по-другому или я неправильно использую параллельный пакет для своих целей?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...