R параллельные вычисления со снегопадом — запись в файлы из отдельных воркеров

Я использую пакет snowfall 1.84 для параллельных вычислений и хотел бы, чтобы каждый рабочий процесс записывал данные в свой отдельный файл во время вычислений. Это возможно ? если да то как?

Я использую соединение типа "SOCK", например, sfInit( parallel=TRUE,...,type="SOCK" ) и хотел бы, чтобы код был независимым от платформы (unix/windows).

Я знаю, что можно использовать параметр «slaveOutfile» в sfInit, чтобы определить файл, в который будут записываться файлы журнала. Но это предназначено для целей отладки, и все подчиненные/рабочие должны использовать один и тот же файл. Мне нужно, чтобы у каждого рабочего был свой выходной файл!!!

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

Спасибо


person user1762374    schedule 21.10.2012    source источник
comment
Я любопытный. Почему вы хотите этого?   -  person Roland    schedule 21.10.2012


Ответы (1)


Простое решение — использовать sfClusterApply для выполнения функции, которая открывает разные файлы на каждом из рабочих процессов, присваивая результирующий файловый объект глобальной переменной, чтобы вы могли писать в него в последующих параллельных операциях:

library(snowfall)
nworkers <- 3
sfInit(parallel=TRUE, cpus=nworkers, type='SOCK')
workerinit <- function(datfile) {
  fobj <<- file(datfile, 'w')
  NULL
}
sfClusterApply(sprintf('worker_%02d.dat', seq_len(nworkers)), workerinit)

work <- function(i) {
  write.csv(data.frame(x=1:3, i=i), file=fobj)
  i
}
sfLapply(1:10, work)
sfStop()
person Steve Weston    schedule 06.01.2014