2016-05-26 4 views
1

Я пытаюсь сделать подключение к файлу в кластере (используя параллель). Несмотря на то, что он корректно работает в глобальной среде, он дает мне сообщение об ошибке при использовании внутри членов кластера (см. Ниже приведенный ниже сценарий). Я что-то пропустил?R подключение к файлу при использовании параллельного

Любое предложение?

Спасибо,

# This part works 
#---------------- 
cat("This is a test file" , file={f <- tempfile()}) 
con <- file(f, "rt") 


# Doing what I think is the same thing gives an error message when executed in parallel 
#-------------------------------------------------------------------------------------- 

library(parallel) 
cl <- makeCluster(2) 

## Exporting the object f into the cluster 

clusterExport(cl, "f") 
clusterEvalQ(cl[1], con <- file(f[[1]], "rt")) 
#Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
# one node produced an error: cannot open the connection 


## Creating the object f into the cluster 

clusterEvalQ(cl[1],cat("This is a test file" , file={f <- tempfile()})) 
clusterEvalQ(cl[1],con <- file(f, "rt")) 
#Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
# one node produced an error: cannot open the connection 


############ Here is my sessionInfo() ################### 
# R version 3.3.0 (2016-05-03) 
# Platform: x86_64-w64-mingw32/x64 (64-bit) 
# Running under: Windows 7 x64 (build 7601) Service Pack 1 
# 
# locale: 
# [1] LC_COLLATE=French_Canada.1252 LC_CTYPE=French_Canada.1252 
# [3] LC_MONETARY=French_Canada.1252 LC_NUMERIC=C     
# [5] LC_TIME=French_Canada.1252  
# 
# attached base packages: 
# [1] stats  graphics grDevices utils  datasets methods base 
# 
+1

Как раз для записи, проблема возникла из функции безопасности антивируса McAfee, избегая выполнения сценария, используя временную папку Windows и другие папки, такие как C: \ temp. Таким образом, простым решением является создание этого файла в другой папке (я предполагаю, что папка без «temp» в ее имени). – Arnaud

ответ

1

Попробуйте изменить код, чтобы вернуть NULL вместо созданного объекта соединения:

clusterEvalQ(cl[1], {con <- file(f[[1]], "rt"); NULL}) 

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

+0

Спасибо за ответ, но к несчастью это не сработает! Проблема связана с настройкой безопасности на компьютере, который я использую на работе. Я попробовал тот же скрипт на своем персональном компьютере, и он работал хорошо (даже без части NULL). – Arnaud

+0

@Arnaud Является ли ваш рабочий компьютер под управлением Windows? Я слышал, что у рабочих не всегда есть разрешение читать файлы, созданные «tempfile» в Windows. Вы можете попробовать создать файлы в своем домашнем каталоге, не используя 'tempfile', чтобы узнать, имеет ли это значение. Я никогда не сталкивался с такой проблемой разрешения на OS X или Linux. –

+0

Я добавил свой sessionInfo() в свой первоначальный запрос. – Arnaud

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