2013-02-08 19 views
5

मैं एक समारोह है कि में पढ़ने के लिए और फिर एक data.table लौट कहा जाता है बनाया है:आर में डेटा.table या data.frame लौटने पर स्मृति आवंटन के दोहराव से बचने के लिए चालें?

read.in.data <- function(filename) 
{ 
    library(data.table) 
    data.holder<-read.table(filename, skip=1) 
    return(data.table(data.holder)) 
} 

मैं समारोह प्रक्रियाओं आर 2 चरणों में इस पर कार्रवाई करने के लगता है कि के रूप में मेरे राम को देख से देखा है (या कम से कम यह क्या हो रहा है के लिए मेरा सबसे अच्छा अनुमान है)। उदाहरण के लिए, जब मैं 1.5 जीबी फ़ाइल (प्रति पंक्ति कुल 136 वर्णों के साथ 15 कॉलम) लोड करता हूं, तो आर 1 में लगता है) डेटा में पढ़ा जाता है और 1.5 जीबी रैम का उपयोग करता है, और फिर 2) 1.5 जीबी रैम का उपयोग करें वापसी।

रहे हैं वहाँ (उस बात के लिए या data.frame) एक data.table बनाने के लिए एक समारोह बनाने के लिए कुछ चाल और स्मृति में दोहराव की आवश्यकता के बिना data.table वापसी? या मुझे उस तालिका के भीतर डेटाटेबल के लिए सभी प्रसंस्करण करना चाहिए जहां तालिका बनाई गई है?

टिप्पणियों: अगर मैं एक पंक्ति में दो बार इस कोड को चलाने के लिए, स्मृति साफ नहीं है; चूंकि मेरे पास केवल 8 जीबी रैम है, फ़ंक्शन विफल हो जाता है। यदि मैं एक चर में "read.table" को संग्रहीत करने के चरण को छोड़ देता हूं (जैसा कि नीचे दिखाया गया है), मुझे कोई लाभ नहीं मिलता है। मैं इसे किसी भी तरह से नहीं करना चाहता, क्योंकि मैं इसे वापस करने से पहले डेटा.table को साफ़ करने की क्षमता रखना चाहता हूं। मेरी समस्या का एक फिक्स मुझे स्मृति से बाहर किए बिना बड़ी फ़ाइलों को संसाधित करने में सक्षम बनाता है।

short.read.trk <- function(fntrk) 
{ 
    library(data.table) 
    return(data.table(read.table(fntrk, skip=1))) 
} 
+4

मुझे आपका दर्द महसूस होता है। V1.8.7 में fread() का प्रयास करें। यह सीधे डेटाटेबल बनाता है ताकि (प्रतिलिपि) डेटा.table() रैपर से बचा जा सके, साथ ही यह read.table से भी अधिक कुशल है (यहां तक ​​कि सभी ज्ञात चाल लागू किए गए हैं)। –

+0

धन्यवाद, मैं फ्रेड() की कोशिश करूंगा जैसे ही 1.8.7 में आर-फोर्ज पर निर्माण होगा (वर्तमान में "निर्माण में विफल" के रूप में सूचीबद्ध है)। – Docuemada

+0

उफ़ - दे मुझे पता है के लिए धन्यवाद - मैं उसकी समीक्षा करेंगे ... –

उत्तर

2

तो स्मृति बचत है, ज्यादातर क्या आप के बाद कर रहे हैं, तो आप इसे एक समय में एक स्तंभ परिवर्तित कर सकते हैं:

library(data.table) 
read.in.data <- function(filename) 
{ 
    data.holder <- read.table(filename, skip=1) 
    dt <- data.table(data.holder[[1]]) 
    names(dt) <- names(data.holder)[1] 
    data.holder[[1]] <- NULL 

    for(n in names(data.holder)) { 
    dt[, `:=`(n, data.holder[[n]]) ] 
    data.holder[[n]] <- NULL 
    } 
    return(dt) 
} 

(untested)

यह किसी भी तेजी से नहीं होगा, वास्तव में यह शायद धीमा है। लेकिन यह स्मृति की कम बर्बाद होना चाहिए।

+0

धन्यवाद, यह एक दिलचस्प तरीका है। जब मैं सोमवार को डेटा सेट तक पहुंच प्राप्त करता हूं, तो मैं इसे लागू कर दूंगा, और परिणामों के साथ इस टिप्पणी को संपादित करूंगा। – Docuemada

+1

+1 दिलचस्प दृष्टिकोण। यह वास्तव में बहुत जल्दी हो सकता है। परीक्षण के लिए अन्य दृष्टिकोण 'data.table()' और (केवल विशेषज्ञों के लिए) के बजाय 'as.data.table()' हैं: 'setattr (डेटा," वर्ग ", सी (" डेटा.फ्रेम "," डेटा। तालिका "))'। –

+0

+1 मुझे स्मृति को कम रखने के लिए "NULL" का उपयोग करने का दृष्टिकोण पसंद है। मैंने टेबल को बाध्य करते समय इसे आज़माया है। उदाहरण के लिए, मैंने डीटी <-do.call ("rbind", list (dt, dt.holder)) जैसे dt.holder <-NULL के बाद इसका उपयोग करने की कोशिश की। हालांकि, उपर्युक्त दृष्टिकोण ने उपयोग की जाने वाली समग्र रैम को नहीं बदला है। प्रस्तावित एक के साथ मेरी मूल लिपि की तुलना करते समय, राम उपयोग वही था। – Docuemada

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