2011-09-07 20 views
14

के साथ सीएसवी फ़ाइलों को पढ़ने में बेहद धीमी है। मेरे पास एक .csv फ़ाइल है: example.csv 8000 कॉलम x 40000 पंक्तियों के साथ। प्रत्येक कॉलम के लिए csv फ़ाइल में स्ट्रिंग हेडर होता है। सभी फ़ील्ड में 0 और 10 के बीच पूर्णांक मान होते हैं। जब मैं read.csv के साथ इस फ़ाइल को लोड करने का प्रयास करता हूं तो यह बेहद धीमा हो जाता है। जब मैं पैरामीटर nrow = 100 जोड़ता हूं तो यह भी बहुत धीमा होता है। मुझे आश्चर्य है कि read.csv को तेज़ करने का कोई तरीका है, या मैट्रिक्स या data.frame के रूप में फ़ाइल को स्मृति में लोड करने के लिए read.csv के बजाय किसी अन्य फ़ंक्शन का उपयोग करें?read.csv बड़ी संख्या में कॉलम

अग्रिम धन्यवाद।

+2

कृपया read.csv पर उपयोग किए जा रहे कोड को साझा करें - प्रदर्शन में सुधार के लिए बहुत सारे विकल्प हैं, देखें? read.table – mdsumner

उत्तर

15

अपनी CSV केवल पूर्णांकों है, तो आप scan बजाय read.csv का उपयोग करना चाहिए, के बाद से ?read.csv का कहना है:

‘read.table’ is not the right tool for reading large matrices, 
especially those with many columns: it is designed to read _data 
frames_ which may have columns of very different classes. Use 
‘scan’ instead for matrices. 

के बाद से अपनी फ़ाइल एक हैडर है, तो आपको skip=1 जरूरत है, और यह शायद तेजी से हो सकता है अगर आप what=integer() सेट करें। यदि आपको read.csv का उपयोग करना चाहिए और गति/स्मृति खपत चिंता का विषय है, तो colClasses तर्क सेट करना एक बड़ी सहायता है।

+1

आप एकल कॉल को पढ़कर अपने कॉलम के नाम जोड़ सकते हैं वह 'रीडलाइन()' फ़ंक्शन के साथ वेक्टर के रूप में हेडर और आपके मैट्रिक्स के कॉलम नामों को संशोधित करता है। – John

+1

धन्यवाद। मुझे बस एक और रैपर फ़ंक्शन स्कैन() का उपयोग करता है: tseries पैकेज में read.matrix फ़ंक्शन। यह दावा करता है कि यह read.csv से तेज़ है। – rninja

3

आप फ़ाइल अक्सर पढ़ेंगे, तो यह अच्छी तरह से save समारोह का उपयोग कर एक बाइनरी फार्मेट में आर से यह बचत के लायक हो सकता है। compress=FALSE निर्दिष्ट करना अक्सर तेज़ लोड समय में परिणाम देता है।

... फिर आप इसे (आश्चर्य!) load फ़ंक्शन के साथ लोड कर सकते हैं।

d <- as.data.frame(matrix(1:1e6,ncol=1000)) 
write.csv(d, "c:/foo.csv", row.names=FALSE) 

# Load file with read.csv 
system.time(a <- read.csv("c:/foo.csv")) # 3.18 sec 

# Load file using scan 
system.time(b <- matrix(scan("c:/foo.csv", 0L, skip=1, sep=','), 
         ncol=1000, byrow=TRUE)) # 0.55 sec 

# Load (binary) file using load 
save(d, file="c:/foo.bin", compress=FALSE) 
system.time(load("c:/foo.bin")) # 0.09 sec 
+2

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

+0

@ जॉन - अच्छा बिंदु। यही कारण है कि मैंने कहा "अक्सर" ;-) – Tommy

8

fread{data.table} का उपयोग करने का प्रयास करें। यह .csv फ़ाइलों को आर में पढ़ने के सबसे तेज़ तरीकों से दूर है। good benchmark here है।

library(data.table) 

data <- fread("c:/data.csv") 

आप इसे भी तेजी से, आप भी केवल स्तंभों की सबसेट आप उपयोग करना चाहते पढ़ सकते हैं बनाना चाहते हैं:

data <- fread("c:/data.csv", select = c("col1", "col2", "col3")) 
+0

मेरे डेटा पर तुरंत क्रैश क्रैश (दस लाख से अधिक कॉलम हैं) – shreyasgm

+0

यह अजीब है; मैं आपको लाइब्रेरी को अनइंस्टॉल और पुनर्स्थापित करने की सलाह दूंगा: aremove.packages ("data.table"); install.packages ("data.table") '। समस्या बनी रहती है, तो आप परियोजना वेबसाइट https://github.com/Rdatatable/data.table/wiki पर एक'issue' खोलने पर विचार करना चाहते हो सकता है –

3

इसके अलावा हेडली है Wickham readr पैकेज का प्रयास करें:

library(readr) 
data <- read_csv("file.csv") 
संबंधित मुद्दे