2015-03-06 16 views
5

में समानांतर फॉर-लूप में डेटा प्रबंधन मैं जूलिया का उपयोग करके कुछ सांख्यिकीय विश्लेषण करने की कोशिश कर रहा हूं। कोड में script.jl (उदा। डेटा की प्रारंभिकरण) और algorithm.jl फ़ाइलें शामिल हैं।जूलिया

सिमुलेशन की संख्या बड़ी है (कम से कम 100,000) इसलिए समांतर प्रसंस्करण का उपयोग करना समझ में आता है।

function script(simulations::Int64) 

# initialise input data 
... 

# initialise other variables for statistical analysis using zeros() 
... 

require("algorithm.jl") 

@parallel for z = 1:simulations 
    while true 

    choices = algorithm(data);  

    if length(choices) == 0 
     break 
    else 
     # process choices and pick one (which alters the data) 
     ... 
    end 

    end 
end 

# display results of statistical analysis 
... 

end 

और

function algorithm(data) 

# actual algorithm 
... 

return choices; 

end 

उदाहरण के रूप में, मुझे पता है कि कैसे कई विकल्प वहाँ औसत पर हैं चाहते हैं, क्या है -

नीचे कोड मेरे सवाल का वर्णन करने के लिए बस कुछ स्यूडोकोड है सबसे आम पसंद, और इतने पर। इस प्रयोजन के लिए मैं कुछ डेटा सांख्यिकीय विश्लेषण चर ( से पहले initialised के लिए लूप) से ( के बाद के लिए लूप) (के लिए लूप में ) choices से बचाने के लिए और परिणामों को प्रदर्शित करने की जरूरत है।

मैंने @spawn और fetch() और pmap() जैसे कार्यों का उपयोग करने के बारे में पढ़ा है, लेकिन मुझे यकीन नहीं है कि मुझे आगे कैसे बढ़ना चाहिए। फॉर-लूप के अंदर केवल चर का उपयोग करना काम नहीं करता है क्योंकि प्रत्येक प्रो को अपनी प्रतिलिपि मिलती है, इसलिए फॉर-लूप के बाद सांख्यिकीय विश्लेषण चर के मान शून्य होंगे।

[संपादित करें] जूलिया में मैं include("script.jl") और script(100000) का उपयोग सिमुलेशन चलाने के लिए जब एक proc का उपयोग कर, कोई समस्या नहीं है। हालांकि, एकाधिक प्रोसेस का उपयोग करते समय (उदा। addprocs(3) का उपयोग करके) सभी सांख्यिकीय चर फॉर-लूप के बाद शून्य होते हैं - जिनकी अपेक्षा की जा सकती है।

+0

क्या आपका 'एल्गोरिदम' फ़ंक्शन हमेशा समान 'डेटा' इनपुट के लिए समान' विकल्प 'देता है? – rickhg12hs

+0

@ rickhg12hs हां यह करता है। – Ailurus

+1

फिर अपने छद्म कोड को देखते हुए, न केवल पहला लूप ('z = 1') किसी भी 'विकल्प' को संसाधित करेगा? – rickhg12hs

उत्तर

1

ऐसा लगता है कि आप एक अंतर्निहित धारावाहिक संचालन को समानांतर करना चाहते हैं, क्योंकि प्रत्येक ऑपरेशन किसी अन्य के परिणाम से संबंधित होता है (इस मामले में data)। मुझे लगता है कि अगर आप की तरह ऊपर कोड को लागू कर सकते हैं:

@parallel (dosumethingwithdata) for z = 1:simulations 
    while true 

    choices = algorithm(data,z);  

    if length(choices) == 0 
     break 
    else 
     # process choices and pick one (which alters the data) 
     ... 
    end 

    data 

    end 
end 

तो आप समस्या के लिए एक समानांतर समाधान मिल सकता है।