//¤³¤Î¥Ú¡¼¥¸¤¬É½¼¨¤µ¤ì¤ëÊý¤Ï¡¢URL¤«¤é¡Öaction=SOURCE&¡×¤òºï½ü¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤ [[£ÒÈ÷˺Ͽ - µ­»ö°ìÍ÷]] !!!R¡ÊR¸À¸ì¡Ë¤ÇÊÂÎó½èÍý - multicore *Åê¹Æ¼Ô¡§ ¤ß¤å *¥«¥Æ¥´¥ê¡§ ¤Ê¤· *Í¥ÀèÅÙ¡§ ÉáÄÌ *¾õÂÖ¡§ ´°Î» *Æü»þ¡§ 2009ǯ01·î17Æü 21»þ55ʬ10Éà //{{bugstate}} !!ÆâÍÆ *http://cran.md.tsukuba.ac.jp/web/packages/multicore/index.html *multicore¤Î»È¤¤Êý¤Ê¤É !´Êñ¤ÊÀâÌÀ *º£¼Â¹Ô¤·¤Æ¤¤¤ëR¤Î´Ä¶­¤È¤Þ¤Ã¤¿¤¯Æ±¤¸¥×¥í¥»¥¹¤òºî¤ê¤Þ¤¹¡¥¤Ä¤Þ¤ê¼«Ê¬¼«¿È¤Î¥¯¥í¡¼¥ó¤ò¡Ö»Ò¥×¥í¥»¥¹¡×¤È¤·¤Æ¡¢¼Â¹Ô¡¥ **Rserve¤Ê¤ó¤«¤È¤¤¤Ã¤·¤ç¤Ç¤¹¤Í¡¥ *¤½¤Î¡Ö»Ò¥×¥í¥»¥¹¡×¤Ë¥³¥Þ¥ó¥É¤òÅϤ·¤Æ¡¢¼Â¹Ô¤µ¤»¤ë¡¥¤Ç¤½¤Î¤È¤­¡¢ÅϤ·¤¿À褬ÊÌ¤Î¥×¥í¥»¥¹¤Ê¤Î¤Ç¡¢º£¸«¤Æ¤¤¤ë¼Â¹Ô´Ä¶­¡Ê¿Æ¥×¥í¥»¥¹¡Ë¤Ë¤Ï¡¢¤Ê¤Ë¤â±Æ¶Á¤òÍ¿¤¨¤Þ¤»¤ó¡¥ *¤·¤«¤â¡¢¥ì¥¹¥Ý¥ó¥¹¤¬¤¹¤°µ¢¤Ã¤Æ¤¯¤ë¡Ê΢¤Ç¤ÏÊ̤ÎR¥×¥í¥»¥¹¤¬Æ°¤¤¤Æ¤¤¤ë¡Ë *CPU¤¬£²¸Ä°Ê¾å¤¢¤Ã¤Æ¡¢ÊÂÎó½èÍý¤Ç¤­¤ë¥¹¥¯¥ê¥×¥È¤Ê¤é¡¢¸ú²Ì¤¬¤¢¤ë¤È¤¤¤¦¤³¤È¤Ç¤·¤ç¤¦¡¥ *Ê̤ÎR¤ò¤ï¤¶¤ï¤¶Î©¤Á¾å¤²¤ë¤è¤ê²¿¤¬¤¤¤¤¤«¤È¤¤¤¦¤È **¼«Ê¬¼«¿È¤Î¥¯¥í¡¼¥ó¤òfork¤¹¤ë¤Î¤Ç¡¢R¤òΩ¤Á¾å¤²¤ë¤È¤¤¤¦½Å¤¤½èÍý¤¬ÉÔÍס¥¤³¤ÎR¤òΩ¤Á¾å¤²¤ë½èÍý¤Ã¤Æ·ë¹½½Å¤¤¤ó¤Ç¤¹¤è¡¦¡¦¡¦ **¼«Ê¬¼«¿È¤Î¥¯¥í¡¼¥ó¤Ê¤Î¤Ç¡¢¤½¤³¤Þ¤Ç¤ËºîÀ®¤·¤¿¥á¥â¥ê¾å¤Ë¾è¤Ã¤Æ¤¤¤ëÊÑ¿ô¤ò¡¢¤½¤Î»Ò¥×¥í¥»¥¹¤Ç»²¾È¤Ç¤­¤ë¡¥ ***¤â¤Á¤í¤ó¡¢»Ò¥×¥í¥»¥¹¤òΩ¤Á¾å¤²¤¿¸å¤ËºîÀ®¤·¤¿¿Æ¥×¥í¥»¥¹¤ÎÊÑ¿ô¤Ï¡¢»Ò¥×¥í¥»¥¹¤«¤é¤Ï¸«¤¨¤Ê¤¤¡¥ ***¤À¤±¤É¸å¤Ç½Ò¤Ù¤ë¡¢¿Æ»Ò´Ö¤ÎÄÌ¿®¤Ç¡¢ÊÑ¿ô¤È¤¤¤¦¤«R¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¿Æ»Ò´Ö¤Ç¤ä¤ê¼è¤ê¤¹¤ë¤³¤È¤Ï¤Ç¤­¤ë¡¥ *¤Á¤ç¤Ã¤È¤À¤á¤Ê¤È¤³ **¼«Ê¬¼«¿È¤Î¥¯¥í¡¼¥ó¤òºîÀ®¤¹¤ë¤Î¤Ç¡¢¿Æ¤È¤Ê¤ëR¤¬Çϼ¯¤Ç¤«¤¤¥á¥â¥ê¤ò»È¤Ã¤Æ¤¤¤¿¤é¡¢»Ò¥×¥í¥»¥¹¤âÇϼ¯¤Ç¤«¤¯¤Ê¤ë¡¥¤â¤Á¤í¤ó¡¢»Ò¥×¥í¥»¥¹¤òºî¤Ã¤¿¸å¤Ë¡¢»Ò¥×¥í¥»¥¹¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤òºï½ü¤·¤Æ£ç£ã¤¹¤ì¤Ð¥á¥â¥ê»ÈÍÑÎ̤ϸº¤ë¤±¤É¡¦¡¦¡¦ **¤³¤³¤À¤±µ¤¤ò¤Ä¤±¤ì¤Ð¤è¤¤¤«¤Ê¡¦¡¦¡¦¡©¤Ä¤Þ¤ê¿Æ¥×¥í¥»¥¹¤Ï¤Ê¤ë¤Ù¤¯¥¹¥ê¥à¤Ë¤·¤Æ¤ª¤¯¤³¤È¡¦¡¦¡¦ *R¥ª¥Ö¥¸¥§¥¯¥È¤Î¥×¥í¥»¥¹´Ö¤Î¤ä¤ê¼è¤ê¤Ï¡ÚRaw Vectors¡Û¤Ç¤ä¤ê¼è¤ê¤¹¤ë¡¥¡ÚRaw Vectors¡Û¤ËÊÑ´¹¤Ç¤­¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤ÏÊ̤Υª¥Ö¥¸¥§¥¯¥È¤Ëʬ²ò¤·¤Æ¤ä¤ê¼è¤ê¤¹¤ëɬÍפ¬¤¢¤ë¡¥¥Ç¡¼¥¿¥Õ¥ì¡¼¥à¤Ê¤É¡¢¥ê¥¹¥È·Á¼°¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï¤½¤Î¤Þ¤Þ¤Ç¤Ï¡¢¡ÚRaw Vectors¡Û¤ËÊÑ´¹¤Ç¤­¤Ê¤¤¤Î¤Ç¡¢Ê¬²ò¤¹¤ëɬÍפ¬¤¢¤ë¡¥ **¤³¤ì¤Ê¤ó¤È¤«¤Ê¤é¤Ê¤¤¤«¤Ê¤¡¡¦¡¦¡¦ !!»È¤¤Êý *¡Öparallel¡×¤È¤«¡Ömclapply¡×¤È¤«¡¢´Êñ¤Ë¡©»È¤¨¤ë´Ø¿ô¤â¤¢¤ë¤±¤É¡¢¤ä¤Ã¤Ñ¤ê»Ò¥×¥í¥»¥¹¤È²ñÏäò¤·¤¿¤¤¤Î¤Ç¡¢¤½¤³¤é¤Ø¤ó¤«¤é¡¥ !»Ò¥×¥í¥»¥¹¤òºî¤ë *»Ò¥×¥í¥»¥¹¤òºî¤ê¤Þ¤¹¡¥ > f <- fork() > > *¤Ê¤ó¤È¡¢¤½¤³¤Ï»Ò¥×¥í¥»¥¹¤ÎÀ¤³¦¡¥¥¨¥ó¥¿¡¼¤Ç²þ¹Ô¤¹¤ë¤È¡¢¿Æ¤ÎÀ¤³¦¤ËÌá¤ê¤Þ¤¹¡¥ *°ì¸ÄÌܤΡÖ>¡×¤¬¿Æ¥×¥í¥»¥¹¤Î¥×¥í¥ó¥×¥È¡¥£²¸ÄÌܤΡÖ>¡×¤¬»Ò¥×¥í¥»¥¹¤Î¥×¥í¥ó¥×¥È¡¥¤³¤Î¾õÂ֤ǰʲ¼¤Î¤è¤¦¤ËÆþÎϤ·¤Æ¤ß¤Þ¤¹¡¥ > > iris2 <- iris[,1] **¿Æ¥×¥í¥»¥¹¤È»Ò¥×¥í¥»¥¹Î¾ÊýÂÔ¤Á¼õ¤±¤Æ¤¤¤ë¤Î¤Ç¡¢¿Æ¥×¥í¥»¥¹¤Ç¤âiris2¤È¤¤¤¦¥ª¥Ö¥¸¥§¥¯¥È¤¬¤Ç¤­¤Þ¤¹¡¥ **¤³¤ì¤Ç¡¢»Ò¥×¥í¥»¥¹¤Îɸ½àÆþÎϤϽªÎ»¤·¤Þ¤¹¡¥ !»Ò¥×¥í¥»¥¹¤«¤é¿Æ¥×¥í¥»¥¹¤Ø¥ª¥Ö¥¸¥§¥¯¥È¤òÁ÷¿®¤¹¤ë *¤³¤Îiris2¤¬»Ò¥×¥í¥»¥¹¤Ç¤âºî¤é¤ì¤Æ¤¤¤ë¤«³Îǧ¤·¤Þ¤¹¡¥ > sendChildStdin(f,"sendMaster(iris2)\n") sendMaster(iris2) [1] TRUE > [1] TRUE *»Ò¥×¥í¥»¥¹¡Ö£æ¡×¤Îɸ½àÆþÎϤˡÖsendMaster(iris2)\n¡×¤È¤¤¤¦¥³¥Þ¥ó¥É¤òÁ÷¤ê¤Þ¤¹¡¥¡ÖsendMaster¡×´Ø¿ô¤Ï¡¢»Ò¥×¥í¥»¥¹¤«¤é¿Æ¥×¥í¥»¥¹¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤ò¥×¥Ã¥·¥å¤¹¤ë´Ø¿ô¤Ç¤¹¡¥ *¤³¤ì¤ò¿Æ¥×¥í¥»¥¹¤Ç¼õ¤±¼è¤ê¤Þ¤¹¡¥ > s <- selectChildren(f) > s [1] 16340 > r <- readChild(f) *¤Þ¤º¡ÖselectChildren¡×´Ø¿ô¤Ç»Ò¥×¥í¥»¥¹¤¬Æɤ߼è¤ê¤Ç¤­¤ë¤«¤É¤¦¤«¤ò³Îǧ¤·¤Þ¤¹¡¥º£¡¢Æɤ߼è¤ì¤ë¾õÂ֤ʤΤǡ¢¡ÖreadChild¡×´Ø¿ô¤ò»È¤Ã¤Æ¡¢»Ò¥×¥í¥»¥¹¤«¤éÁ÷¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤ò¼õ¤±¼è¤ê¤Þ¤¹¡¥ *°Ê²¼¼õ¤±¼è¤Ã¤¿¡Ö£ò¡×¤ÎÃæ¿È > r [1] 58 0a 00 00 00 02 00 02 08 01 00 02 03 00 00 00 00 0e 00 00 00 96 40 14 [25] 66 66 66 66 66 66 40 13 99 99 99 99 99 9a 40 12 cc cc cc cc cc cd 40 12 [49] 66 66 66 66 66 66 40 14 00 00 00 00 00 00 40 15 99 99 99 99 99 9a 40 12 ¡¦¡¦¡¦¡Ê³¤¯¡Ë *¤³¤ì¤¬¤¤¤ï¤æ¤ë¡ÚRaw Vectors¡Û¡¥iris2¤Î¡ÚRaw Vectors¡Û¤é¤·¤¤¤Ç¤¹¡¥ÉáÄ̤Υª¥Ö¥¸¥§¥¯¥È¤Ëľ¤·¤Þ¤¹¡¥ > unserialize(r) [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 [19] 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 [37] 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5 [55] 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 [73] 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5 [91] 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 [109] 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 [127] 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 [145] 6.7 6.7 6.3 6.5 6.2 5.9 *iris[,1]¤ÈƱ¤¸¤Ç¤¹¡¥ !¿Æ¥×¥í¥»¥¹¤«¤é»Ò¥×¥í¥»¥¹¤Ø¥ª¥Ö¥¸¥§¥¯¥È¤òÁ÷¿®¤¹¤ë *¡ÖsendChildStdin¡×´Ø¿ô¤ò»È¤¤¤Þ¤¹¡¥£²ÈÖÌܤΰú¿ô¤Ë¡ÚRaw Vectors¡Û·Á¼°¤Î¥ª¥Ö¥¸¥§¥¯¥È¤òÅϤ¹¤ÈÎɤ¤¤é¤·¤¤¡¥ > sendChildStdin(f, as.raw(r)) *¥Ð¥°¤Ã¤Æ¤Þ¤¹¤«¤Ê¡¦¡¦¡¦ *¤Ê¤é¥À¥ó¥×¤·¤¿¥Æ¥­¥¹¥È¤òÅϤ»¤Ð¤¤¤¤¤«¡¦¡¦¡¦ iris3 <- iris textCn <- textConnection("tmp", "w") dump("iris3", textCn) close(textCn) tmp [1] "`iris3` <-" [2] "structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, " [3] "5, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, " ¡¦¡¦¡¦¡Ê³¤¯¡Ë invisible(sendChildStdin(f, "multicore:::closeStdout()\n")) tmp <- paste("invisible(", paste(tmp, collapse="\n"), ")\n", sep="") sendChildStdin(f, tmp) *¤³¤ì¤Ç¤Ç¤­¤Æ¤¤¤ë¤Ï¤º¡¥ *¡ÖsendChildStdin(f, "multicore:::closeStdout()\n")¡×¤Ï»Ò¥×¥í¥»¥¹¤Î¤Û¤¦¤Ç¡¢½ÐÎϤµ¤ì¤ëɸ½à½ÐÎϤòÍÞÀ©¤¹¤ë¡¥¤³¤ì¤¬¤Ê¤¤¤È¡¢¤¤¤Á¤¤¤Áɽ¼¨¤¬¤µ¤ì¤Æ¤ß¤Ë¤¯¤¤¤Î¤Ç¡¥¤Ç¤â³«È¯Ã桦¥Ç¥Ð¥Ã¥°Ãæ¤Ï½ÐÎϤϤ¢¤Ã¤¿¤Û¤¦¤¬¤¤¤¤¤Ç¤¹¤Í¡¦¡¦¡¦ *¤³¤Î¸å¤í¤Î¤Û¤¦¤Î¡Ö»Ò¥×¥í¥»¥¹Æâ¤Ç¥³¥Þ¥ó¥É¤òɾ²Á¤¹¤ë´Ø¿ô¤òºî¤ë¡×¤ò¤´»²¾È¤¯¤À¤µ¤¤ !parallel *¤¤¤Á¤¤¤Á¡¢É¸½à½ÐÎϤòÍÞÀ©¤¹¤ë¤Î¤È¤«¤á¤ó¤É¤¯¤µ¤¤¤Î¤Ç»Ò¥×¥í¥»¥¹ºî¤ë¤È¤­¤Ï¡Öparallel¡×»È¤Ã¤¿¤Û¤¦¤¬Îɤ¤¤«¤â¡¥ > f <- parallel(1:10, silent = T) > f parallelJob: processID=16533 *¡Ö£±¡§£±£°¡×¤Î¤È¤³¤í¤Ï¡¢²¿¤Ç¤â¤¤¤¤¤Ç¤¹¡¥¡Ösilent = T¡×¤Ç¡¢¡Ömulticore:::closeStdout()¡×¤ò´Ø¿ôÆâÉô¤Ç¤ä¤Ã¤Æ¤¯¤ì¤Þ¤¹¡¥ *¤¿¤À¤·¡¢¤³¤Î¤Þ¤Þ¤À¤È¡Ö£±¡§£±£°¡×¤Î·ë²Ì¤ò¿Æ¥×¥í¥»¥¹¤ËÊÖ¤½¤¦¤È¤·¤Æ¤¤¤ë¤Î¤Ç¡¢ collect(f) *¤Ç¡¢·ë²Ì¤ò¼õ¤±¼è¤Ã¤Æ¤ª¤¤¤¿¤Û¤¦¤¬Îɤ¤¡© > collect(f) $`16589` [1] 1 2 3 4 5 6 7 8 9 10 *¤³¤Î»Ò¥×¥í¥»¥¹¤ò£±¸Äºî¤Ã¤¿¾õÂ֤ǡ¢°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡¥ $ ps -ejH ¡¦¡¦¡¦ 12488 12488 12488 pts/2 00:00:00 bash 16584 16584 12488 pts/2 00:00:00 R 16589 16584 12488 pts/2 00:00:00 R ¡¦¡¦¡¦ !»Ò¥×¥í¥»¥¹¤«¤é¿Æ¥×¥í¥»¥¹¤Ø¥ª¥Ö¥¸¥§¥¯¥È¤òÁ÷¿®¤¹¤ë­¢ *Àè¤Û¤É»Ò¥×¥í¥»¥¹¤«¤é¿Æ¥×¥í¥»¥¹¤Ø¥ª¥Ö¥¸¥§¥¯¥È¤òÅϤ¹¤È¤­¤Ë¡¢¤¤¤í¤¤¤í¤È¤á¤ó¤É¤¯¤µ¤¤¤³¤È¤ò¤·¤¿¤±¤ì¤É¡¢¡Öcollect¡×´Ø¿ô¤ò»È¤¦¤È¤â¤·¤«¤·¤Æ¤é¤¯¤Á¤ó¡© sendChildStdin(f,"iris4 <- iris[,2]\n") sendChildStdin(f,"sendMaster(iris4)\n") collect(f) *¼Â¹Ô > sendChildStdin(f,"iris4 <- iris[,2]\n") Error in FUN(16589L[[1L]], ...) : child 16589 doesn't exist *¤Ã¤Æ¡¢»Ò¥×¥í¥»¥¹¤¬¤¤¤Ê¤¡¤¡¤¡¤¡¤¤¡¥ 12488 12488 12488 pts/2 00:00:00 bash 16584 16584 12488 pts/2 00:00:00 R 16589 16584 12488 pts/2 00:00:00 R *¤ª¤Ê¤¯¤Ê¤ê¤Ë¤Ê¤Ã¤Æ¤Þ¤¹¡¦¡¦¡¦¡¥»ÅÍͤǤ¹¤«¡©¡Öcollect¡×¤·¤¿¤é¥×¥í¥»¥¹»¦¤·¤Á¤ã¤¦¤ó¤À¤í¤¦¤«¡¦¡¦¡¦ **¤É¤¦¤â¡Öparallel¡×´Ø¿ô¤ÎÃæ¤Ç¡¢¥ª¥Ö¥¸¥§¥¯¥È¤òÅϤ·¤¿¸å¤Ë¡¢¡Öexit(0)¡×¤È¤¤¤¦¤Î¤Ç¡¢»¦¤·¤Á¤ã¤Ã¤Æ¤ë¤ß¤¿¤¤¤Ç¤¹¡¥¡Öparallel¡×¤ò»²¹Í¤Ë´Ø¿ô¤òºî¤Ã¤Æ¤ß¤¿¡¥ createChild <- function (name, mc.set.seed = FALSE, silent = FALSE) { f <- fork() env <- parent.frame() if (inherits(f, "masterProcess")) { #on.exit(exit(1, structure("fatal error in wrapper code", # class = "try-error"))) if (isTRUE(mc.set.seed)) set.seed(Sys.getpid()) if (isTRUE(silent)) multicore:::closeStdout() #sendMaster(try(eval(expr, env), silent = TRUE)) #exit(0) } if (!missing(name) && !is.null(name)) f$name <- as.character(name)[1] class(f) <- c("parallelJob", class(f)) f } *¤³¤ì¤Ç¤É¤¦¤«¤Ê > f <- createChild(silent = T) > f parallelJob: processID=16756 > sendChildStdin(f,"iris4 <- iris[,2]\n") [1] TRUE > sendChildStdin(f,"sendMaster(iris4)\n") [1] TRUE > collect(f,wait=F) [[1]] [1] 3.5 3.0 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 3.4 3.0 3.0 4.0 4.4 3.9 3.5 [19] 3.8 3.8 3.4 3.7 3.6 3.3 3.4 3.0 3.4 3.5 3.4 3.2 3.1 3.4 4.1 4.2 3.1 3.2 [37] 3.5 3.6 3.0 3.4 3.5 2.3 3.2 3.5 3.8 3.0 3.8 3.2 3.7 3.3 3.2 3.2 3.1 2.3 [55] 2.8 2.8 3.3 2.4 2.9 2.7 2.0 3.0 2.2 2.9 2.9 3.1 3.0 2.7 2.2 2.5 3.2 2.8 [73] 2.5 2.8 2.9 3.0 2.8 3.0 2.9 2.6 2.4 2.4 2.7 2.7 3.0 3.4 3.1 2.3 3.0 2.5 [91] 2.6 3.0 2.6 2.3 2.7 3.0 2.9 2.9 2.5 2.8 3.3 2.7 3.0 2.9 3.0 3.0 2.5 2.9 [109] 2.5 3.6 3.2 2.7 3.0 2.5 2.8 3.2 3.0 3.8 2.6 2.2 3.2 2.8 2.8 2.7 3.3 3.2 [127] 2.8 3.0 2.8 3.0 2.8 3.8 2.8 2.8 2.6 3.0 3.4 3.1 3.0 3.1 3.1 3.1 2.7 3.2 [145] 3.3 3.0 2.5 3.0 3.4 3.0 > collect(f,wait=F) NULL *»Ò¥×¥í¥»¥¹¤â»à¤ó¤Ç¤Ê¤¤¤Î¤ÇOK !»Ò¥×¥í¥»¥¹¤Î½ªÎ»¤Î»ÅÊý *ÀµÄ¾¡¢¾¡¼ê¤Ë»à¤ó¤Ç¤ë¤³¤È¤¬Â¿¤¤¤Î¤ÇÎɤ¯¤ï¤«¤ê¤Þ¤»¤ó¡¦¡¦¡¦¡¥¤¬ kill(f, SIGQUIT) *¤Ç¡¢ÌÀ¼¨Åª¤Ë 16790 16584 12488 pts/2 00:00:00 R *¤³¤¦¤¤¤¦¾õÂ֤ˤϤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡¥¤Ë¤·¤Ê¤¤¤Ç¡¢¿Æ¥×¥í¥»¥¹¤ÎR¤ò½ªÎ»¤·¤Æ¤·¤Þ¤¦¤È 16684 16584 12488 pts/2 00:00:00 R 16685 16584 12488 pts/2 00:00:00 R 16740 16584 12488 pts/2 00:00:00 R 16754 16584 12488 pts/2 00:00:00 R 16755 16584 12488 pts/2 00:00:00 R *¤³¤ó¤Ê¤Ò¤É¤¤¤³¤È¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¤Î¤Ç¡¢¤´Ãí°Õ¡¥ *¿Æ¤ÎRÆâ¤Ç¡¢»Ò¥×¥í¥»¥¹¤Î¥Õ¥©¡¼¥«¥¹¤¬¤Ê¤¯¤Ê¤ëÁ°¤Ë¡Ökill(***, SIGQUIT)¡×¤Ç¤Ë¤·¤Æ¤ª¤­¤Þ¤·¤ç¤¦¡¥ *¤È¤¤¤¦¤«¡ÖRserve¡×¤ß¤¿¤¤¤Ë¡¢¤­¤Á¤ó¤È½ª¤ï¤ëÊýË¡¤Ï¤Ê¤¤¤ó¤Ç¤¹¤«¡©¡©¡© !rmChild *¡ÖrmChild¡×¤È¤¤¤¦´Ø¿ô¤òȯ¸«¡¥¤³¤ì¤Ç»Ò¥×¥í¥»¥¹¤òÍî¤È¤¹¤³¤È¤¬¤Ç¤­¤½¤¦¡¥ **¥Þ¥Ë¥å¥¢¥ë¤Ë¤ÏºÜ¤Ã¤Æ¤Ê¤¤¤Í¡¦¡¦¡¦ > kill(f, SIGQUIT) > multicore:::rmChild(f) [1] TRUE *»Ò¥×¥í¥»¥¹¤³¤ì¤Ç¤Ï¡¢Íî¤Á¤Þ¤»¤ó¤Í¡¦¡¦¡¦ !»Ò¥×¥í¥»¥¹Æâ¤Ç¥³¥Þ¥ó¥É¤òɾ²Á¤¹¤ë´Ø¿ô¤òºî¤ë childEval <- function( child, cmd, send=F ){ if( !is.character(cmd) ){ print("'cmd' must be character...") return } #cmd <- paste(cmd, "\n", sep="") if( send ) cmd <- paste("sendMaster(try({",cmd,"}, silent=T))\n", sep="") else cmd <- paste("try({",cmd,"}, silent=T)\n", sep="") #cat(cmd) ret <- sendChildStdin(child, cmd) s <- selectChildren(child) if (is.logical(s) || !length(s)){ } else{ cat("ready to get data...\n") } #if( is.numeric(s) ) cat("ready to get data...\n") ret } *¥Æ¥¹¥È childEval(f, "x<-1:10") collect(f, wait=F) !¿Æ¥×¥í¥»¥¹¤«¤é»Ò¥×¥í¥»¥¹¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤ò¤ï¤¿¤¹ *·ë¶É¡ÖsendChildStdin¡×´Ø¿ô¤ÇÀ¸¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¤½¤Î¤Þ¤ÞÅϤ¹¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤Î¤Ç¡¥ textCn <- textConnection("sendCmd", "w") dump("iris3", textCn) close(textCn) sendCmd [1] "`iris3` <-" [2] "structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, " [3] "5, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, " ¡¦¡¦¡¦¡Ê³¤¯¡Ë #sendCmd <- paste("invisible(", paste(sendCmd, collapse="\n"), ")\n", sep="") sendCmd <- paste(sendCmd, collapse="\n") childEval(f, sendCmd) #sendChildStdin(f, sendCmd) *¤Ò¤È¤Ä¤Î´Ø¿ô¤Ë¤Þ¤È¤á¤ë sendObj2Child <- function( child, obj ){ textCn <- textConnection("sendCmd", "w") dump(deparse(substitute(obj)), textCn) close(textCn) sendCmd <- paste(sendCmd, collapse="\n") #cat(sendCmd) childEval(child, sendCmd) } *¤À¤±¤É·ë¶É¡¢Ê¸»úÎó¤ÎŤµ¤Ë¤âÀ©¸Â¤¬¤¢¤ë¤Î¤Ç¡¢¤³¤ì¤â°ìÈÌŪ¤Ë¤Ï»È¤¨¤Ê¤¤¡¥ **¾®¤µ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤·¤«»È¤¨¤Þ¤»¤ó¡¥ !¡ß»Ò¥×¥í¥»¥¹¤«¤é¥ª¥Ö¥¸¥§¥¯¥È¤ò¼èÆÀ¤¹¤ë´Ø¿ô¤òºî¤ë¡ß getObj <- function( child, what ){ if( !is.character(what) ){ print("'what' must be character...") return } cmd <- paste("sendMaster(try({",what,"}, silent=T))\n", sep="") print(cmd) ret <- sendChildStdin(child, cmd) s <- selectChildren(child) if( is.numeric(s) ) return( collect(child, wait=F) ) NA } *¥Æ¥¹¥È getObj (f, "x") *¤³¤Ã¤Á¤Ï¤Ä¤«¤¨¤Ê¤¤¤Ê¡¦¡¦¡¦ !!¥³¥á¥ó¥È //{{comment}}