Не могу использовать read.table () внутри цикла foreach (doSMP) - PullRequest
3 голосов
/ 23 марта 2011

Я пытаюсь использовать 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%, это вообще не проблема.

Ответы [ 2 ]

3 голосов
/ 13 августа 2014

Внутри цикла foreach вы должны вызывать пакет, который собираетесь использовать.

Пример:

i)

foreach (i =  1:length(filelist), .packages = "rgdal") %dopar% ......

в вашем случае вы должны назвать вектор пакетов.

ПРИМЕР 2:

ii)

package.vector <- c("package.1","package.2",etc)

foreach (i =  1:length(filelist), .packages = package.vector) %dopar% ......

Я рекомендую вам вызывать все пакеты, которые вы используете

1 голос
/ 13 апреля 2011

Я не думаю, что параллельный ввод ускоряет процесс. Ограничивающим фактором является контроллер диска, поэтому он не помогает, когда вы открываете 2 соединения и считываете данные, потому что он все равно должен пройти через контроллер диска. Дисковый ввод-вывод является последовательным заданием (к сожалению), если у вас нет RAID-массива с несколькими дисковыми контроллерами. Параллельный ввод-вывод хорошо работает только в кластерах, где у каждой машины есть свой собственный диск.

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