2014-02-05 3 views
2

я создал параллельные рабочие (все работает на той же машине) с помощью:Параллелизация в R: как «источник» на каждом узле?

MyCluster = makeCluster(8) 

Как я могу сделать каждый из этих источников 8 узлов Я-файл я написал? Я пробовал:

clusterCall(MyCluster, source, "myFile.R") 
clusterCall(MyCluster, 'source("myFile.R")') 

И несколько подобных версий. Но никто не работал. Не могли бы вы помочь мне разобраться с ошибкой?

спасибо!

+0

Первая версия должна работать, вторая неверна, потому что строка не является функцией. Но почему, по-вашему, первый не работает? Вы получили сообщение об ошибке? –

ответ

4

Следующий код служит вашей цели:

library(parallel) 

cl <- makeCluster(4) 
clusterCall(cl, function() { source("test.R") }) 

## do some parallel work 

stopCluster(cl) 

Также вы можете использовать clusterEvalQ() сделать то же самое:

library(parallel) 

cl <- makeCluster(4) 
clusterEvalQ(cl, source("test.R")) 

## do some parallel work 

stopCluster(cl) 

Однако существует тонкое различие между этими двумя методами. clusterCall() выполняет функцию на каждом узле, а clusterEvalQ() оценивает выражение для каждого узла. Если у вас есть переменный список файлов для источника, clusterCall() будет проще в использовании, так как clusterEvalQ(cl,expr) будет рассматривать любые expr в качестве выражения, поэтому здесь не удобно размещать переменную.

+0

Большое спасибо Ren, я успешно использовал ваш метод: 'clusterCall (cl, function() {source (" test.R ")})' Позвольте мне добавить только одно. Я умел его выводить <- clusterCall (cl, function() {source ("test.R")}) ', потому что в противном случае он выводит мне много ненужной информации. –

+0

Отлично. 'invisible (...)' также будет работать для предотвращения явного вывода. –

+0

Через несколько месяцев я все еще использую этот код для параллелизации. К сожалению, я должен использовать старые пакеты из CRAN с помощью контрольных точек. Я открыл еще один вопрос, чтобы обсудить эту связанную проблему: http://stackoverflow.com/questions/37028653/r-set-checkpoint-on-worker-of-cluster –

1

Если вы используете команду для источника локального файла, убедитесь, что файл есть.

Else поместите файл на сетевой ресурс или NFS и введите абсолютный путь.

еще лучше, и стандартные ответы, написать пакет и установлено, что пакет на каждом узле, а затем просто вызвать library() или require().

+0

Извините, я забыл сказать, что все рабочие работают на одном компьютере. Они должны использовать только разные ядра. Поэтому доступность файлов не должна быть проблемой. –

+0

Ну, я думаю, что у меня есть примеры работы на слайдах «Intro to HPC with R», поэтому вы можете копировать оттуда. Проблема все равно может быть одинаковой: разные рабочие каталоги для ваших работников. Попробуйте абсолютный путь. –

+0

Прошу прощения, но мне не удалось «загрузить» мои файлы. Я пробовал абсолютный путь следующим образом: 'clusterCall (MyCluster, 'source (" D: /folder/file.R ")')' и 'clusterCall (MyCluster, source," D: /folder/file.R ")' Но никто не работал. Первая выводит мне список определений функций, которые я никогда раньше не видел. Второй жалуется, что функция "source (" D: /folder/file.R ")" не найдена. –

Смежные вопросы