Ошибка вызова функции сериализации 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)
Глядя на справочную страницу 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, не принес много пользы. В любом случае, большое спасибо за ваш ответ!
Я не мог найти точно, что было не так с звонком, но, по крайней мере, я мог обойти проблему.
Хитрость заключалась в том, чтобы разбить аргументы вызова функции для каждого параллельного потока на более мелкие блоки.
Волшебным образом ошибка исчезла.
Дайте мне знать, если то же самое сработало для вас!
5 ответов
Скорее всего, это связано с нехваткой памяти (подробности см. В моем блоге). Вот пример, как вы можете вызвать эту ошибку:
> 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
Я долго боролся с этой проблемой и смог ее исправить, переместив все необходимые пакеты в аргументы внутри цикла foreach, используя .packages=c("ex1","ex2")
, Ранее я только что использовал require("ex1")
внутри цикла, и это, кажется, было основной причиной моих ошибок.
В целом, я бы просто убедился, что вы перемещаете все возможное в аргументы foreach, чтобы избежать подобных ошибок.
Я получил похожую ошибку Ошибка в unserialize(узел $con): ошибка чтения из соединения
Я обнаружил, что это был отсутствующий аргумент при вызове корыта функции C .Call()
Может быть, это может помочь!
У меня была такая же ошибка, используя foreach
с doSNOW
бэкэнд.
Я получил ту же ошибку, что и op, после тайм-аута, но при запуске задачи без использования foreach
ошибка не будет возвращена.
Судя по всему, диспетчер задач может убивать процессы по множеству причин, а не только из-за нехватки памяти.
В моем конкретном случае, похоже, проблема была в температуре ядра. Уменьшение количества ядер процессора и установкаsys.sleep()
Вызов сделал систему более прохладной, и ошибка перестала появляться.
Возможно, стоит попробовать.
У меня та же проблема, и я сомневаюсь, что это проблема памяти. Мой код так же прост, как:
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
Программа работает в любом случае, поэтому я просто проигнорировал ее. Тем не менее, я всегда чувствую себя неловко, чтобы увидеть эти ошибки в файле журнала.
В Shiny я вызвал эту ошибку, записав в объект activetiveValues внутри параллельного кода