web-dev-qa-db-fra.com

Erreur lors de l'appel de la fonction sérialiser R

Je charge les paquets suivants dans R:

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

Je "parallélise" le code pendant un long moment, mais dernièrement, je reçois des arrêts INTERMITTENT pendant que le code est en cours d'exécution. L'erreur est:

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

Mon hypothèse est que la connexion que j'ouvre à l'aide des commandes ci-dessous a expiré:

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

En regardant la page de manuel de makeCluster, je constate que, par défaut, les connexions n'expire qu'après 30 jours! Je pouvais définir des options (error = recover) afin de vérifier, à la volée, si la connexion était ouverte ou non lorsque le code s'arrêtait, mais j'ai décidé de poster cette question générale avant.

IMPORTANT:

1) l'erreur est vraiment intermittente, parfois je ré-exécute le même code sans aucune erreur . 2) J'exécute tout sur le même ordinateur multicœur (Intel/8 cœurs). Donc, ce n’est pas un problème de communication (réseau) entre les clusters . 3) Je suis un grand utilisateur de parallélisation de processeur et de GPU, sur mon ordinateur portable et mon ordinateur de bureau (64 coeurs). Malheureusement, c’est la première fois que je reçois ce type d'erreur.

Est-ce que quelqu'un a le même type d'erreur?

Comme demandé, je fournis mon 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, en dessous de l'erreur dans l'un des appels (encore une fois, c'est intermittent):

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

Ajouter un peu plus d'informations. J'ai défini les options (erreur = récupérer) et il a fourni les informations suivantes:

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

J'ai essayé de vérifier si les connexions étaient toujours disponibles, et il y a:

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]> 

Puisque les connexions sont ouvertes et que l'erreur 0 signifie la version R (comme l'a souligné @SteveWeston), je ne peux vraiment pas comprendre ce qui se passe ici.

EDIT 1:

Mon contournement du problème

Le code convient pour les arguments passés à la fonction. Ainsi, la réponse fournie par @MichaelFilosi n'a pas apporté grand-chose à la table. De toute manière, merci beaucoup pour votre réponse! 

Je ne pouvais pas trouver exactement ce qui n'allait pas avec l'appel, mais au moins, je pouvais résoudre le problème.

L'astuce consistait à casser les arguments de l'appel de fonction, pour chaque thread parallèle, en blocs plus petits.

Comme par magie, l'erreur a disparu.

Faites-moi savoir si la même chose a fonctionné pour vous!

26
MSardelich

Ceci est probablement dû au manque de mémoire (voir mon blog post pour plus de détails). Voici un exemple comment vous pouvez provoquer cette erreur:

> 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
10
Max Gordon

J'ai eu du mal à résoudre ce problème pendant un certain temps et j'ai pu le résoudre en déplaçant tous mes packages requis dans les arguments de la boucle foreach à l'aide de .packages=c("ex1","ex2"). Auparavant, je venais d'utiliser require("ex1") dans la boucle, ce qui semble avoir été à l'origine de mes erreurs. 

Globalement, je voudrais simplement m'assurer que vous introduisez le plus possible dans les arguments foreach afin d'éviter ce type d'erreur. 

2
Johnathan A

J'ai eu une erreur similaire Erreur dans unserialize (node ​​$ con): erreur lors de la lecture de la connexion

J'ai découvert que c'était un argument manquant dans un appel à une fonction C via .Call() Peut-être que cela peut être utile!

2
Michele Filosi

J'ai le même problème et je doute que ce soit un problème de mémoire. Mon code est aussi simple que:

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

et j'ai eu le message d'erreur suivant dans 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

Le programme fonctionne quand même, alors je l’ignorais pour le moment. Cependant, je me sens toujours mal à l'aise de voir ces erreurs dans le fichier journal.

1
Yue Zhao

Dans Shiny, j'ai provoqué cette erreur en écrivant dans un objet reactiveValues ​​dans le code parallèle. 

0
PeterVermont