2012-11-26 11 views
6

के समानांतर में निष्पादित किया जा सकता है क्या आर के साथ समानांतर में एकल मल्टी-कोर मशीन पर एक पाठ फ़ाइल पर पुनरावृत्ति संभव है? संदर्भ के लिए, पाठ फ़ाइल कहीं भी 250-400 एमबी JSON आउटपुट के बीच है।क्या रीडलाइन को आर

संपादित करें:

यहाँ मैं चारों ओर के साथ खेल रहे हैं कुछ कोड नमूने हैं। मेरे आश्चर्य के लिए, समांतर प्रसंस्करण जीत नहीं मिली - बस मूलभूत रूप से - लेकिन यह मेरे हिस्से पर उपयोगकर्ता त्रुटि के कारण हो सकता है। इसके अलावा, जब बड़ी संख्या में बड़ी फ़ाइलों को पढ़ने की कोशिश की जाती है, तो मेरी मशीन दबा दी जाती है।

## test on first 100 rows of 1 twitter file 
library(rjson) 
library(parallel) 
library(foreach) 
library(plyr) 
N = 100 
library(rbenchmark) 
mc.cores <- detectCores() 
benchmark(lapply(readLines(FILE, n=N, warn=FALSE), fromJSON), 
      llply(readLines(FILE, n=N, warn=FALSE), fromJSON), 
      mclapply(readLines(FILE, n=N, warn=FALSE), fromJSON), 
      mclapply(readLines(FILE, n=N, warn=FALSE), fromJSON, 
        mc.cores=mc.cores), 
      foreach(x=readLines(FILE, n=N, warn=FALSE)) %do% fromJSON(x), 
      replications=100) 

यहाँ के गैर समानांतर फ़ाइल-प्रणाली आईओ प्रकृति के कारण एक दूसरे कोड नमूना

parseData <- function(x) { 
    x <- tryCatch(fromJSON(x), 
       error=function(e) return(list()) 
       ) 
    ## need to do a test to see if valid data, if so ,save out the files 
    if (!is.null(x$id_str)) { 
    x$created_at <- strptime(x$created_at,"%a %b %e %H:%M:%S %z %Y") 
    fname <- paste("rdata/", 
        format(x$created_at, "%m"), 
        format(x$created_at, "%d"), 
        format(x$created_at, "%Y"), 
        "_", 
        x$id_str, 
        sep="") 
    saveRDS(x, fname) 
    rm(x, fname) 
    gc(verbose=FALSE) 
    } 
} 

t3 <- system.time(lapply(readLines(FILES[1], n=-1, warn=FALSE), parseData)) 
+0

JSON फ़ाइल पढ़ने या JSON फ़ाइल को पार्स करने में समस्या क्या है? –

+0

न तो। जब मैं लूप के लिए एक सरल उपयोग करने की कोशिश करता हूं तो मेरी मशीन अंततः जम जाती है। मैंने प्रत्येक जेएसओएन एंट्री के खिलाफ एक फ़ंक्शन चलाने का प्रयास किया है, अलग-अलग आरडीएस फ़ाइलों को वापस पढ़ने के लिए बाहर निकालें, आदि। प्रत्येक विकल्प के साथ, मैं मेमोरी उपयोग के बारे में भी जागरूक हूं और जब भी संभव हो तो अनुकूलित और साफ करने का प्रयास करता हूं। कुछ विचार भयानक थे, लेकिन अंत में, मैं आधार आर के साथ बड़े डेटासेट का "विश्लेषण" करने के तरीकों को समझना चाहता हूं, इस तथ्य को अनदेखा कर रहा हूं कि इस समय के लिए बेहतर समाधान मौजूद हैं। – Btibert3

+0

एक पुनरुत्पादित उदाहरण हमें प्रतिक्रिया प्रदान करने के लिए अधिक आसान बना देगा। –

उत्तर

7

जवाब क्या पर निर्भर करता है समस्या वास्तव में है: फ़ाइल को समानांतर में पढ़ना, या समानांतर में फ़ाइल को प्रोसेस करना।

समानांतर

में पढ़ा जाए तो एकाधिक इनपुट फाइलों में JSON फ़ाइल को विभाजित और उन्हें समानांतर में पढ़ सकते हैं, जैसे कि plyr कार्यों एक समानांतर बैकएंड के साथ संयुक्त का उपयोग करते हुए:

result = ldply(list.files(pattern = ".json"), readJSON, .parallel = TRUE) 

एक बैकएंड पंजीयन शायद parallel पैकेज जो अब आधार आर में एकीकृत है उपयोग किया जा सकता या आप doSNOW पैकेज का उपयोग कर सकते हैं, जानकारी के लिए this post on my blog देखते हैं। समानांतर

इस परिदृश्य आपका सर्वश्रेष्ठ दांव पात्रों में से एक सदिश में पूरे डाटासेट पढ़ने के लिए है में

प्रसंस्करण, डेटा को विभाजित और फिर एक समानांतर बैकएंड उदा के साथ संयुक्त का उपयोग plyr फ़ंक्शंस।

+1

कोई बुरा विचार नहीं है। और यदि आप फ़ाइल को काटने का कोई तरीका ढूंढ रहे हैं, तो यूनिक्स 'स्प्लिट' कमांड पर नज़र डालें। –

+0

लिनक्स कमांड हमेशा एक अच्छा समाधान होते हैं;) –

+0

@ जेफएलेन दिलचस्प।वास्तव में आदेशों के साथ समय से पहले डेटा को पूर्व-प्रसंस्करण के बारे में नहीं सोचा था। किसी भी खिंचाव से कमांड लाइन पर एक विशेषज्ञ नहीं, लेकिन जितना अधिक मैं चारों ओर पोक करता हूं, मैं देखता हूं कि कुछ कमांड कितने शक्तिशाली हो सकते हैं। – Btibert3

2

शायद नहीं के साथ readLines() है। बेशक, यदि आप समानांतर एनएफएस या एचडीएफएस जैसे कुछ का उपयोग कर रहे हैं, तो यह प्रतिबंध लागू नहीं होगा। लेकिन मानते हैं कि आप "मानक" आर्किटेक्चर पर हैं, तो यह आपके readLine() कॉलों को समानांतर करने के लिए संभव नहीं होगा।

आपका सबसे अच्छा शर्त शायद पूरे के रूप में < 500MB देखकर फ़ाइल में पढ़ने के लिए शायद स्मृति में फिट होगा, तो प्रसंस्करण parallelize एक बार आप कर रहे हैं वस्तु पहले से ही में पढ़ा जाता है होगा।

+0

+1, लेकिन कुछ काम के साथ आप शायद प्रत्येक कार्यकर्ता को लाइन नंबर असाइन करके समांतर 'रीडलाइन' प्राप्त कर सकते हैं जिसे उन्हें किसी दिए गए फ़ाइल कनेक्शन से पढ़ने की आवश्यकता है। –

+0

@PaulHiemstra क्या आप उदाहरण दे सकते हैं कि यह सबसे आसान संभव मामले में कैसे किया जा सकता है? :) –

+0

@ एंथनी डेमिको मेरे पास अभी समय नहीं है, लेकिन मुझे लगता है कि यह मामूली नहीं है, और यह बहुत अच्छा काम नहीं कर सकता है। –

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