2016-02-10 2 views
0

У меня есть таблица M с множеством столбцов и строк, полученных из текстового файла:R снегопады: параллельно применять на столбцах таблицы

M <- read.table("text.csv",header=TRUE,sep="\t") 

Чтобы получить ряды по столбцам я успешно использовал:

M <- apply(M,2,rank) 

Я хотел бы ускорить вычисление, но мне не удалось реализовать эту функцию в снегопаде.

Я пробовал:

library(snowfall) 
sfStop() 
nb.cpus <- 8 
sfInit(parallel=TRUE, cpus=nb.cpus, type = "SOCK") 
M <- sfClusterApplyLB(M, rank) # does not work 
M <- sfClusterApply(M,2,rank) # does not work 
M <- sfClusterApplyLB(1:8, rank,M) # does not work 

Что является эквивалентом M <- apply(M,2,rank) в снегопада?

Заранее благодарим за вашу помощь!

+0

Второй аргумент «sfClusterApply» должен быть функцией. Он не принимает аргумент «margin». –

ответ

1

Эквивалент apply в снегопаде составляет sfApply. Вот пример:

library(snowfall) 
sfInit(parallel=TRUE, cpus=4, type="SOCK") 
M <- data.frame(matrix(rnorm(40000000), 2000000, 20)) 
r <- sfApply(M, 2, rank) 
sfStop() 

Этот пример работает почти в два раза быстрее, чем последовательная версия на моей машине Linux с использованием четырех ядер. Это не так уж плохо, учитывая, что rank не очень интенсивно работает в вычислительных целях.

0

Вот рабочий пример:

rank_M_df_col_fx=function(i){ 
    #M<- read.table("text.csv",header=TRUE,sep="\t") 
    col_rank=rank(M[,i]) 
    return(col_rank) 
} 

M=data.frame(replicate(10,sample(0:100,1000,rep=TRUE))) 
n_cols=ncol(M) 

library(snowfall) 
sfInit(parallel=TRUE) # 
sfExportAll() 
rank_results_list=sfLapply(x=c(1:n_cols), fun=rank_M_df_col_fx) 
rank_dataframe <- data.frame(matrix(unlist(rank_results_list), nrow=nrow(M), byrow=F)) 

sfRemoveAll() 
sfStop() 

Однако, показав, как это сделать, это тип быстрой операции, распараллеливание, скорее всего, не даст существенно более быстрые результаты, учитывая накладные расходы, начиная экземпляры и т. д.

+0

Большое спасибо за этот очень хороший ответ! Я сделал несколько тестов и, как вы указали, параллельный код не быстрее, по крайней мере, на моем примере. – Fred

+0

Нет проблем! Если мой ответ отвечает на ваш вопрос, вы должны проверить его как правильный ответ ... –

0

Большое спасибо за помощь!

Я, наконец, объединил решение Lucas и Steve, чтобы получить идеальное решение для моей проблемы.

Я думаю, что мой код не работал с M < - sfClusterApply (M, 2, rank), потому что sfExportAll() отсутствовал.

Итак, наконец, самое простое решение работает для меня:

M <- read.table("text.csv",header=TRUE,sep="\t") 
n_cols=ncol(M) 
nb.cpus <- 4 
library(snowfall) 
sfStop() 
sfInit(parallel=TRUE, cpus=nb.cpus, type = "SOCK") 
sfExportAll() 
M <- sfApply(M,2,rank) 
sfRemoveAll() 
sfStop() 
+0

Функция «ранга» не нуждается в каких-либо данных из глобальной среды для правильной работы, тогда как функция «rank_M_df_col_fx» в ответе Лукаса. Использование «sfExportAll» в вашем ответе тратит время на создание глобальных переменных для рабочих, которые не будут использоваться. Причина «sfClusterApply» не сработала для вас, потому что она эквивалентна «lapply», а не «применяется». –

+0

Спасибо за этот комментарий Лукас. Это правда, что на простом примере ранга «sfExportAll» бесполезен. В другом более сложном вычислении мне понадобился «sfExportAll». – Fred

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