2011-10-04 7 views
5

क्या बर्फ पैकेज में clusterEvalQ और clusterExport के समान एक डूएसएमपी क्लस्टर शुरू करने का कोई तरीका है? उदाहरण के लिए:आप कर्मचारियों को डीएसएमपी के साथ कैसे शुरू कर सकते हैं?

x <- 1:10 
y <- 10:1 
z <- rnorm(10) 
cl <- makeSOCKcluster(2) 
clusterEvalQ(cl, library(quantmod)) 
clusterExport(cl, list("x","y","z")) 
clusterEvalQ(cl, ls()) 
clusterEvalQ(cl, search()) 

doSMP के लिए एक initEnvir विकल्प नहीं है, लेकिन ?doSMP कहते

‘initEnvir’ is a function to be executed by each worker before any 
tasks are executed associated with a foreach. Its purpose is to 
initialize the execution environment, or the worker in general. 
It is only executed by a worker if that worker executes at least 
one task associated with the foreach. 

प्रत्येक कार्यकर्ता आदेश अभिव्यक्ति मैं करने के लिए भेजने के चलाने के लिए कई बड़ी वस्तुओं की एक प्रति की जरूरत है foreach। इसके अतिरिक्त, मुझे इन बड़ी वस्तुओं के समान संस्करणों के साथ foreach कई सौ बार कॉल करने की आवश्यकता है। इन ऑब्जेक्ट्स को प्रत्येक कॉल के लिए foreach पर प्रतिलिपि बनाना अक्षम होगा।

भले ही ऐसा करने के लिए तैयार तरीके न हो, मैं एक कड़वाहट की सराहना करता हूं।

+0

मैंने सोचा था कि आधार वातावरण है, जो नकल करने की आवश्यकता नकारना होगा करने के लिए उपयोग किया गया था। या क्या मैं कुछ न कुछ भूल रहा हूं? – Iterator

+2

बस उत्सुक है कि आप बर्फ के बजाय डीओएसएमपी के साथ क्यों कार्यान्वित कर रहे हैं? मुझे बर्फ अधिक स्थिर और पोर्टेबल पाया गया है। – darckeen

+0

@ डेर्किन: मैं doSMP के साथ _only_ लागू नहीं कर रहा हूं। मैं उपयोगकर्ताओं के लिए डीओएसएमपी सहित जो कुछ भी फ़ोरैच बैकएंड चुनता हूं, उन्हें नियोजित करने के लिए विकल्प बना रहा हूं। –

उत्तर

1

foreach का पहला तर्क ... है जो लक्षित अभिव्यक्ति के मूल्यांकन के लिए पुनरावृत्त वस्तुओं को स्थानांतरित करता है। यदि आपको केवल ऑब्जेक्ट का हिस्सा चाहिए, तो किसी ऑब्जेक्ट के केवल हिस्सों को पास करने के लिए iter का उपयोग करना अधिक कुशल हो सकता है।

w <- startWorkers(workerCount = 4) 
registerDoSMP(w) 

foreach(x=iter(x),y=iter(y),z=iter(z)) %dopar% (x*y*z) 

बुला वातावरण में वस्तुओं अभी भी उपलब्ध हैं:

foreach(1:10) %dopar% (x*y*z) # Somewhat repetitious # 

zed <- 20:1 
foreach(x=iter(x)) %dopar% (x*zed) 
+0

आपका आखिरी उदाहरण जो मैं करने की कोशिश कर रहा हूं, उसके करीब है, सिवाय इसके कि 'ज़ेडड' कई सौ एमबी है, और यह उदाहरण जेनेटिक एल्गोरिदम अनुकूलन के दौरान कई सैकड़ों या हजारों बार चलाया जाएगा। कई सौ/हजार 'foreach' कॉलों में से प्रत्येक के लिए' zed' की प्रतिलिपि बनाना महंगा होगा। –

0

इस प्रयास करें:

library(doSMP) 
library(foreach) 
w <- startWorkers(workerCount = 4) 
registerDoSMP(w) 
foreach(i = 1:3) %dopar% sqrt(i) 

या आप doSNOW इस्तेमाल कर सकते हैं और

registerDoSNOW(cl) 

http://cran.r-project.org/web/packages/doSNOW/doSNOW.pdf

अंत में, doMC (विंडोज़ के लिए नहीं)

library(doMC) 
registerDoMC() 
foreach(i = 1:3) %dopar% sqrt(i) 

सभी है इन टीईसी hniques 2.14 में नए समांतर पैकेज से पहले काम करते हैं, जो मुझे विश्वास है कि इन तकनीकों का कुछ एकीकरण किया है।

+0

यह मेरे प्रश्न का उत्तर नहीं देता है। मुझे 'foreach' कॉल करने से पहले श्रमिकों को वस्तुओं की प्रतिलिपि बनाने की आवश्यकता है। मैं अन्य बैकएंड के बारे में जानता हूं, लेकिन मुझे 'डीओएसएमपी' के लिए एक समाधान की आवश्यकता है (मेरी टिप्पणी देखें)। –

संबंधित मुद्दे