2013-08-14 14 views
9

में विशिष्ट लाइनों को कुशलता से पढ़ना मुझे आश्चर्य है कि बड़ी फ़ाइल (11 जीबी +) से किसी विशिष्ट रेखा में पढ़ने के लिए आर कितनी देर लगती है। उदाहरण के लिए:बड़ी फ़ाइलों से आर

> t0 = Sys.time() 
> read.table('data.csv', skip=5000000, nrows=1, sep=',') 
     V1  V2 V3 V4 V5 V6 V7 
1 19.062 56.71047 1 16 8 2006 56281 
> print(Sys.time() - t0) 
Time difference of 49.68314 secs 

ओएसएक्स टर्मिनल तत्काल एक विशिष्ट रेखा वापस कर सकता है। क्या किसी को आर में एक और अधिक कुशल तरीका पता है?

+5

यह अक्षम है क्योंकि 'read.table' कॉल' readLines (फ़ाइल, छोड़ें) 'जो वास्तव में रेखाओं को पार करता है और आर में पढ़ता है, फिर उन्हें फेंक देता है। अधिक कुशल होने के लिए मुझे लगता है कि आपको कुछ सी कोड सही करना होगा, जब तक आप पर्याप्त न्यूलाइन नहीं देखते हैं (और आपको तेजी से बफरिंग का उपयोग करने की आवश्यकता होगी) – hadley

उत्तर

18

वैसे आप बस लाइन अन्य खोल उपकरणों के साथ निकाली गई पढ़ने के लिए इस

dat <- read.table(pipe("sed -n -e'5000001p' data.csv"), sep=',') 

की तरह कुछ का उपयोग कर सकते हैं।

यह भी ध्यान रखें कि system.time(someOps) समय मापने का एक आसान तरीका है।

+0

धन्यवाद डिर्क। यह सूत्र मेरे लिए काम करता है: 'dat <- read.table (पाइप (" sed '5000000q; d' data.csv "), sep = ',')' – geotheory

+0

या किसी श्रेणी के लिए: 'read.table (पाइप (" sed -n '5000010q; 5000000,5000010p' data.csv "), sep = ',')' – geotheory

+0

क्षमा करें, पते के बाद 'p' को याद किया। अब सही किया गया। यदि आप सीमा को जानते हैं, तो दोनों तरह के विकल्प और बहुत सारे विकल्प हैं। –

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