2013-05-17 6 views
6

मेरे पास एक ऐसा प्रोग्राम है जो CSV डेटा की लाइनों को आउटपुट करता है जिसे मैं डेटा फ्रेम में लोड करना चाहता हूं। मैं वर्तमान में तो जैसे डेटा लोड:डेटा फ्रेम में सीएसवी आउटपुट प्राप्त करने का सबसे तेज़ तरीका क्या है?

tmpFilename <- "tmp_file" 
system(paste(procName, ">", tmpFilename), wait=TRUE) 
myData <- read.csv(tmpFilename) # (I also pass in colClasses and nrows for efficiency) 

हालांकि, मैं एक फाइल करने के लिए उत्पादन पुनः निर्देशित सोचा बस से अक्षम था (कार्यक्रम 30MB के बारे में पता थूक को पढ़ने के लिए, तो मैं अनुकूलतम प्रदर्शन के साथ संभाल करना चाहते हैं)। मैंने सोचा था कि textConnection इस का समाधान होगा, इसलिए मैंने कोशिश की:

con <- textConnection(system(procName, intern=TRUE)) 
myData <- read.csv(con) 

यह बहुत धीमी चलाता है, हालांकि, और जबकि पहले समाधान इनपुट आकार के साथ रैखिक खराब हो, textConnection समाधान के प्रदर्शन खराब हो तेजी से ऐसा लगता है। सबसे धीमा हिस्सा textConnection बना रहा है। read.csv यहां वास्तव में पहले समाधान की तुलना में तेज़ हो जाता है क्योंकि यह स्मृति से पढ़ रहा है।

मेरा प्रश्न तब है, बस read.csv चलाने के लिए फ़ाइल बना रहा है, यह गति के संबंध में मेरा सबसे अच्छा विकल्प है? क्या पाठ कनेक्शन के निर्माण को तेज करने का कोई तरीका है? बोनस: टेक्स्ट कनेक्शन क्यों धीमा कर रहा है?

+0

ऐसा लगता है कि आप एक अतिरिक्त वेक्टर पूरे उत्पादन युक्त, 'प्रशिक्षु = TRUE' साथ बना रहे हैं। आउटपुट के उत्पादन के रूप में वह वेक्टर बढ़ता रहेगा, जो लगातार स्मृति आवंटित करेगा। यदि आप उस पंक्ति को दो आदेशों में विभाजित करते हैं, तो 'आउटपुट <- सिस्टम (procname, intern = TRUE); con <- textConnection (आउटपुट) ', मुझे अत्यधिक संदेह है कि' system' कमांड अधिकतर समय ले जाएगा। –

+0

सही, इसलिए यदि मैं इसे विभाजित करता हूं, तो सबसे लंबा कथन 'टेक्स्टकनेक्शन (आउटपुट)' कॉल है। "सबसे लंबे समय तक", मेरा मतलब है कि 'सिस्टम' में कुछ सेकंड लगते हैं, 'read.csv' में कुछ और सेकंड लगते हैं,' टेक्स्टकनेक्शन() 'में 4 मिनट लगते हैं। – Hudon

+1

वाह। यह ओएस क्या है? यदि यह लिनक्स है, तो मैं 'dev/shm' के तहत फ़ाइल बनाउंगा जो रैम के अलावा कुछ भी नहीं उपयोग करेगा। –

उत्तर

3

"सबसे तेज़ तरीका" शायद read.csv के अलावा किसी अन्य चीज़ का उपयोग करने में शामिल होगा। हालांकि, पाइप तरीका का उपयोग कर किया जा सकता है जाने के लिए read.csv साथ चिपके हुए,:

myData <- read.csv(pipe(procName)) 

यह एक मध्यवर्ती बफर में पूरा टेक्स्ट उत्पादन पढ़ने टाल (कम से कम पहले read.csv यह के ahold हो जाता है)।

कुछ समय तुलना:

> write.csv(data.frame(x=rnorm(1e5)), row.names=FALSE, file="norm.csv") 
> system.time(d <- read.csv("norm.csv")) 
    user system elapsed 
    0.398 0.004 0.402 
> system.time(d <- read.csv(textConnection(system("cat norm.csv", intern=TRUE)))) 
    user system elapsed 
56.159 0.106 56.095 
> system.time(d <- read.csv(pipe("cat norm.csv"))) 
    user system elapsed 
    0.475 0.012 0.531 
+0

के उत्तर में @ एमनेल के स्पीड टेस्ट में सबसे तेज़ है, बस यह कोशिश की गई और ऐसा लगता है कि मैं जो कुछ ढूंढ रहा था (कुछ सेकंड बंद कर दिया)। मुझे 'पाइप' के बारे में कोई जानकारी नहीं थी। धन्यवाद! – Hudon

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

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