2014-04-22 11 views
11

मैं कुछ आर कोड चलाने की कोशिश कर रहा हूं और यह स्मृति के कारण क्रैश हो रहा है। त्रुटि है कि मैं मिलता है:mclapply लंबे वैक्टर अभी तक समर्थित नहीं हैं

StationUserX <- function(userNDX){ 
    lat1 = deg2rad(geolocation$latitude[userNDX]) 
    long1 = deg2rad(geolocation$longitude[userNDX]) 
    session_user_id = as.character(geolocation$session_user_id[userNDX]) 
    #Find closest station 
    Distance2Stations <- unlist(lapply(stationNDXs, Distance2StationX, lat1, long1)) 
    # Return index for closest station and distance to closest station 
    stations_userX = data.frame(session_user_id = session_user_id, 
           station = ghcndstations$ID[stationNDXs], 
           Distance2Station = Distance2Stations)  
    stations_userX = stations_userX[with(stations_userX, order(Distance2Station)), ] 
    stations_userX = stations_userX[1:100,] #only the 100 closest stations... 
    row.names(stations_userX)<-NULL 
    return(stations_userX) 
} 

मैं mclapply 50 बार उपयोग करते हुए इस समारोह चलाएँ:

Error in sendMaster(try(lapply(X = S, FUN = FUN, ...), silent = TRUE)) : 
    long vectors not supported yet: memory.c:3100 

समारोह है कि मुसीबतों बनाता है निम्नलिखित है। StationUserX Distance2StationX 90k बार कॉल कर रहा है।

क्या फ़ंक्शन StationUserX को अनुकूलित करने का कोई स्पष्ट तरीका है?

+0

क्या आपने यह देखने के लिए 'वेक्टरिज़' या 'cmpfun' ('कंपाइलर पैकेज में) का परीक्षण किया है, यह देखने के लिए कि क्या यह कोई आसान गति अप प्रदान करता है? –

+0

समांतरता के लिए 'foreach' के बारे में भी सोचता है जो –

उत्तर

13

mclapply कार्यकर्ता धागे से सभी डेटा को मुख्य धागे में वापस भेजने में समस्या हो रही है। यह prescheduling की वजह से है, जहां यह प्रति धागे की बड़ी संख्या में पुनरावृत्तियों चलाता है, और फिर सभी डेटा वापस syncs। यह अच्छा और तेज़ है, लेकिन परिणामस्वरूप> 2 जीबी डेटा वापस भेजा जा रहा है, जो यह नहीं कर सकता है।

mclapplymc.preschedule=F के साथ प्री-शेड्यूलिंग बंद करने के लिए चलाएं। अब, प्रत्येक पुनरावृत्ति अपने स्वयं के धागे को जन्म देगी और अपना डेटा वापस कर देगी। यह काफी तेज़ नहीं होगा, लेकिन यह समस्या के आसपास हो जाता है।

-1

पैकेज से nextElem() का उपयोग करने का प्रयास करें। यह "generator" in Python की तरह कार्य करता है, इसलिए आपको पूरी सूची को स्मृति में लोड करने की आवश्यकता नहीं है।

+0

को लागू करने के लिए तुच्छ है, मैं अगले एलेम के लिए मैन पेज देख रहा हूं लेकिन मुझे वास्तव में यह नहीं पता कि मुझे इसका उपयोग करने के लिए अपने फ़ंक्शन को कैसे संशोधित करना चाहिए। क्या आप मुझे दिखा सकते है? धन्यवाद! – Ignacio

+0

क्या आप बता सकते हैं कि "ऑब्जेक्ट" कौन सा ऑब्जेक्ट समस्या पैदा कर रहा है? विचार यह है कि आप एक ही समय में पूरे वेक्टर को पारित करने के बजाय वेक्टर के तत्वों को पास करने के लिए '' 'NextElem()' '' का उपयोग करेंगे। – rsoren

+0

त्रुटि संदेश वास्तव में नहीं कहता है। मैं स्टेशनउसरएक्स को mclapply के साथ कॉल कर रहा हूं और StationUserX पास कर रहा हूं। StationUserX 50k अवलोकनों का एक वेक्टर है। ऑब्जेक्ट जो फ़ंक्शन उत्पन्न करता है, स्टेशन_userX वास्तव में एक बड़ी वस्तु है। मेरे पास 50k उपयोगकर्ता 50 स्टेशन उपयोगकर्ता हैं। तो आउटपुट में 5 मिलन पंक्तियां और 3 कॉलम होंगे। – Ignacio

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