Я пытаюсь использовать doSMP / foreach для распараллеливания некоторого кода в R.
У меня была огромная двумерная матрица генетических данных - 10000 наблюдений (строки) и 3 миллиона переменных (столбцов).Мне пришлось разделить эти данные на куски по 1000 переменных из-за проблем с памятью.
Я хочу прочитать в каждом файле, сделать некоторые статистические данные и записать эти результаты в файл.Это легко с циклом for, но я хочу использовать foreach, чтобы ускорить его.Вот что я делаю:
# load doSMP, foreach, iterators, codetools
require(doSMP)
# files i'm processing
print(filelist <- system("ls matrix1k.*.txt", T))
#initialize processes
w <- startWorkers(2)
registerDoSMP(w)
# for each file, read into memory, do some stuff, write out results.
foreach (i = 1:length(filelist)) %dopar% {
print(i)
file <- filelist[i]
print(file)
thisfile <- read.table(file,header=T)
# here i'll do stuff using that file
# here i'll write out results of the stuff I do above
}
#stop processes
stopWorkers(w)
Но это приводит к ошибке: Error in { : task 2 failed - "cannot open the connection"
.Когда я изменяю %dopar%
на %do%
, это вообще не проблема.