Как использовать функцию source () в парализованном цикле (doSMP)? - PullRequest
2 голосов
/ 22 июня 2011

Я пытаюсь ускорить мой код с помощью цикла 'foreach', используя пакет doSMP.

Вот упрощенная версия моей проблемы: я запускаю файл с именем main.R

файл: main.R:

require(doSMP)
dropbox_path = "/home/ruser/Dropbox"
workers <- startWorkers(4)
registerDoSMP(workers)
foreach(jj=1:4 ) %dopar% source("test.R")
stopWorkers(workers)

файл: test.R:

message(dropbox_path)

Возвращает следующую ошибку: "Ошибка в источнике (" test.R "): задача 1 не выполнена - "объект 'dropbox_path' не найден"

Если я изменю main.R на:

require(doSMP)
dropbox_path = "/home/ruser/Dropbox"
workers <- startWorkers(4)
registerDoSMP(workers)
foreach(jj=1:4 ) %dopar% message(dropbox_path)
stopWorkers(workers)

Тогда это работает очень хорошо. Он также хорошо работал с последовательным кодом («для» вместо «foreach»).

Таким образом, R дочерние экземпляры могут обращаться к переменной dropbox_path, но не тогда, когда она анализируется через функцию-источник. Я попытался поиграться с аргументами функции source () local и chdir, но безуспешно.

Знаете ли вы, как работает код? Я хотел бы продолжать использовать функцию source ().

1 Ответ

1 голос
/ 22 июня 2011

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

tiny_script.R содержание:

date()

R код для запуска нескольких ядер:

library(snowfall)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK") #power up
my.list <- vector("list", 10)

sfLapply(x = my.list, fun = function(x) source("./Odpad/tiny_script.R")) 

Работа на одном ядре с использованием только lapply:

> lapply(X = my.list, FUN = function(x) source("./Odpad/tiny_script.R")) #notice the difference in argument names between `lapply` and `sfLapply`.
[[1]]
[[1]]$value
[1] "Wed Jun 22 13:02:11 2011"

[[1]]$visible
[1] TRUE


[[2]]
[[2]]$value
[1] "Wed Jun 22 13:02:11 2011"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...