2015-11-19 4 views
2

У меня проблема при использовании пакета tm и параллельных вычислений в R, и я не уверен, что я делаю что-то глупое или если это ошибка.Неправильное количество измерений - параллельное вычисление R

Я создал небольшой воспроизводимый пример:

# Load the libraries 
library(tm) 
library(snow) 

# Create a Document Term Matrix 
test_sentence = c("this is a test", "this is another test") 
test_corpus = VCorpus(VectorSource(test_sentence)) 
test_TM = DocumentTermMatrix(test_corpus) 

# Define a simple function that returns the matrix for the i-th document 
test_function = function(i, TM){ TM[i, ] } 

Если я бегу простой lapply, используя этот пример, я получаю то, что ожидается, без каких-либо проблем:

# This returns the expected list containing the rows of the Matrix 
res1 = lapply(1:2, test_function, test_TM) 

Но если я запускаю его параллельно I получить ошибку:

первая ошибка: неправильное количество измерений

# This should return the same thing of the lapply above but instead it stops with an error 
cl = makeCluster(2) 
res2 = parLapply(cl, 1:2, test_function, test_TM) 
stopCluster(cl) 

ответ

2

Проблема в том, что разные узлы не загружают пакет tm. Загрузка пакета необходима, однако, поскольку он определяет метод [ для соответствующего класса объектов.

Приведенный ниже код выполняет следующие действия:

  1. начать кластере
  2. нагрузки на tm пакет во всех узлах
  3. экспортировать все объекты на все узлы
  4. запустить функцию
  5. остановить кластер

cl <- makeCluster(rep("localhost",2), type="SOCK") 
clusterEvalQ(cl, library(tm)) 
clusterExport(cl, list=ls()) 
res <- parLapply(cl, as.list(1:2), test_function, test_TM) 
stopCluster(cl) 
+0

Вы совершенно правы .. какая глупая ошибка. Я предположил, что как только матрица была рассчитана, больше не было необходимости в библиотеке, не думая, что [метод находится внутри пакета. Большое спасибо! –

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