Подтвердить что ты не робот

Ошибка при вызове функции сериализации R

Я загружаю следующие пакеты в R:

library(foreach)
library(doParallel)
library(iterators)

Я "распараллеливаю" код в течение длительного времени, но в последнее время я получаю прерывания INTERMITTENT во время работы кода. Ошибка:

Error in serialize(data, node$con) : error writing to connection

Моя образованная догадка заключается в том, что, возможно, соединение, которое я открываю с помощью приведенных ниже команд, истекло:

## Register Cluster
##
cores<-8
cl <- makeCluster(cores)
registerDoParallel(cl)

Глядя на man-страницу makeCluster, я вижу, что по умолчанию соединения истекают только через 30 дней! Я мог бы установить параметры (ошибка = восстановить), чтобы проверить "на лету", если соединение открыто или нет, когда код останавливается, но я решил опубликовать этот общий вопрос раньше.

ВАЖНО:

1) ошибка действительно прерывистая, иногда я повторно запускаю тот же код и не получаю ошибок. 2) Я запускаю все на одной многоядерной машине (Intel/8 ядер). Таким образом, это не проблема коммутации (сети) среди кластеров. 3) Я большой пользователь CPU и GPU-распараллеливания, на моем ноутбуке и на рабочем столе (64 ядра). К сожалению, я впервые получаю этот тип ошибок.

Кто-нибудь имеет такой же тип ошибки?

В соответствии с запросом я предоставляю свой sessionInfo():

> sessionInfo()
R version 2.15.3 (2013-03-01)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] TTR_0.22-0       xts_0.9-3        doParallel_1.0.1 iterators_1.0.6  foreach_1.4.0    zoo_1.7-9        Revobase_6.2.0   RevoMods_6.2.0  

loaded via a namespace (and not attached):
[1] codetools_0.2-8 compiler_2.15.3 grid_2.15.3     lattice_0.20-13 tools_2.15.3   

@SeteveWeston, ниже ошибки в одном из вызовов (опять же, это прерывистый):

starting worker pid=8808 on localhost:10187 at 15:21:52.232
starting worker pid=5492 on localhost:10187 at 15:21:53.624
starting worker pid=8804 on localhost:10187 at 15:21:54.997
starting worker pid=8540 on localhost:10187 at 15:21:56.360
starting worker pid=6308 on localhost:10187 at 15:21:57.721
starting worker pid=8164 on localhost:10187 at 15:21:59.137
starting worker pid=8064 on localhost:10187 at 15:22:00.491
starting worker pid=8528 on localhost:10187 at 15:22:01.855
Error in unserialize(node$con) : 
  ReadItem: unknown type 0, perhaps written by later version of R
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted

Добавление немного дополнительной информации. Я устанавливаю параметры (ошибка = восстановление) и предоставляет следующую информацию:

Error in serialize(data, node$con) : error writing to connection

Enter a frame number, or 0 to exit   

1: #51: parallelize(FUN = "ensemble.prism", arg = list(prism = iis.long, instances = oos.instances), vectorize.arg = c("prism", "instances"), cores = cores, .export 
2: parallelize.R#58: foreach.bind(idx = i) %dopar% pFUN(idx)
3: e$fun(obj, substitute(ex), parent.frame(), e$data)
4: clusterCall(cl, workerInit, c.expr, exportenv, obj$packages)
5: sendCall(cl[[i]], fun, list(...))
6: postNode(con, "EXEC", list(fun = fun, args = args, return = return, tag = tag))
7: sendData(con, list(type = type, data = value, tag = tag))
8: sendData.SOCKnode(con, list(type = type, data = value, tag = tag))
9: serialize(data, node$con)

Selection: 9

Я попытался проверить, доступны ли соединения, и есть:

Browse[1]> showConnections()
   description                class      mode  text     isopen   can read can write
3  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
4  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
5  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
6  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
7  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
8  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
9  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
10 "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
Browse[1]> 

Поскольку соединения открыты, а ошибка 0 означает версию R (как указано в @SteveWeston), я действительно не могу понять, что здесь происходит.

РЕДАКТИРОВАТЬ 1:

МОЯ РАБОТА В ПРОБЛЕМЕ

Код хорош в терминах аргументов, переданных функции. Таким образом, ответ, предоставленный @MichaelFilosi, не принес много к таблице. В любом случае, большое спасибо за ваш ответ!

Я не смог найти точно, что не так с вызовом, но, по крайней мере, я мог бы решить эту проблему.

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

Магически ошибка исчезла.

Сообщите мне, если бы то же самое сработало для вас!

4b9b3361

Ответ 1

Это, скорее всего, из-за нехватки памяти (см. мой сообщение в блоге). Вот пример того, как вы можете вызвать эту ошибку:

> a <- matrix(1, ncol=10^4*2.1, nrow=10^4)
> cl <- makeCluster(8, type = "FORK")
> parSapply(cl, 1:8, function(x) {
+   b <- a + 1
+   mean(b)
+   })
Error in unserialize(node$con) : error reading from connection

Ответ 2

Я получил аналогичную ошибку   Ошибка в unserialize (node $con): ошибка чтения из соединения

Я выяснил, что это был отсутствующий аргумент при вызове функции C с помощью .Call() Может быть, это может быть полезно!

Ответ 3

Я долгое время боролся с этой проблемой и смог ее исправить, переместив все мои требуемые пакеты в аргументы в цикле foreach, используя .packages=c("ex1","ex2"). Раньше я только что использовал require("ex1") внутри цикла, и это, по-видимому, стало основной причиной моих ошибок.

В целом я бы просто удостоверился, что вы перемещаете все возможное в аргументы foreach, чтобы избежать подобных ошибок.

Ответ 4

У меня такая же проблема, и я сомневаюсь, что это проблема памяти. Мой код так же прост, как:

library(doParallel)
library(foreach)
cl <- makeCluster(2, outfile='LOG.TXT')
registerDoParallel(cl)
res <- foreach(x=1:10) %dopar% x

и я получил следующее сообщение об ошибке в LOG.TXT:

starting worker pid=13384 on localhost:11776 at 18:25:29.873
starting worker pid=21668 on localhost:11776 at 18:25:30.266
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted

Программа работает в любом случае, поэтому я просто проигнорировал ее пока. Однако мне всегда неловко видеть эти ошибки в файле журнала.

Ответ 5

В Shiny я вызвал эту ошибку, написав объекту reactiveValues ​​внутри параллельного кода

Ответ 6

У меня была такая же ошибка при использовании foreach с бэкэндом doSNOW.

После тайм-аута я получил ту же ошибку, что и операция, но при запуске задачи без использования foreach ошибка не возвращалась.

По-видимому, диспетчер задач может убивать процессы по множеству причин, а не только из-за нехватки памяти.

В моем конкретном случае кажется, что проблема заключалась в температуре ядра. Сокращение количества ядер процессора и выполнение sys.sleep() сделали систему работающей круче, и ошибка перестала появляться.

Возможно, стоит попробовать.