2017-06-11 13 views
5

मैं डेटा के एक बड़े सेट के साथ काम कर रहा हूं जिसमें 2^31 अवलोकन शामिल हैं। अवलोकनों की वास्तविक संख्या 3.5 बिलियन अवलोकनों के करीब है।2^31 अवलोकनों के साथ biglm का उपयोग कैसे करें

मैं लगभग 70 भविष्यवाणियों के साथ एक रिग्रेशन चलाने के लिए आर पैकेज "biglm" का उपयोग कर रहा हूं। मैंने डेटा में एक लाख पंक्तियों को एक समय में पढ़ा और रिग्रेशन परिणामों को अपडेट किया। डेटा को आरएफडीएफ प्रारूप में आर पुस्तकालय "एफएफडीएफ" का उपयोग करके जल्दी से लोड करने और मेरी सभी रैम का उपयोग करने से बचने के लिए सहेजा गया है।

library(ff,ffbase,biglm) 
load.ffdf(dir='home') 

dim(data) #the ffdf contains about 70 predictors and 3.5 billion rows 

chunk_1 <- data[1:1000000,] 
rest_of_data <- data[1000000:nrow(data),] 

# Running biglm for first chunk 
b <- biglm(y~x1+x2+...+x70, chunk_1) 

chunks <- ceiling((nrow(rest_of_data)/1000000) 

# Updating biglm results by iterating through the rest of the data chunks 
for (i in seq(1,chunks)){ 
     start <- 1+((i-1))*1000000 
     end <- min(i*1000000,nrow(d)) 
     d_chunk <- d[start:end,] 
     b<-update(b,d_chunk) 
} 

परिणाम बहुत अच्छी लग रही है और सब कुछ डेटा के प्रत्येक टुकड़ा 2 से अधिक के साथ मॉडल को अद्यतन करने से टिप्पणियों की संचयी संख्या तक सुचारू रूप से चल रहा है:

यहाँ कोड मैं उपयोग कर रहा हूँ की बुनियादी रूपरेखा है^31 अवलोकन। फिर, मुझे एक त्रुटि मिलती है जो

In object$n + NROW(mm) : NAs produced by integer overflow 

मैं इस ओवरफ़्लो समस्या को कैसे प्राप्त करूं? आपकी सहायता के लिये पहले से ही धन्यवाद!

+1

@ डेविड एडनबर्ग मैं वर्तमान में 64-बिट सिस्टम का उपयोग कर रहा हूं, और मैं आर 3.4.0 का उपयोग कर रहा था। हालांकि, मैं अभी भी पूर्णांक अतिप्रवाह समस्या में चल रहा था। – Eunice

+0

क्या आपके पास वास्तव में 1.8TB डेटासेट है? –

उत्तर

7

मेरा मानना ​​है कि मुझे इस मुद्दे का स्रोत biglm कोड में मिला है।

अवलोकनों की संख्या (n) एक पूर्णांक के रूप में संग्रहीत है, 2^31 - 1 के has a max value

numeric प्रकार इस सीमा के अधीन नहीं है, और जहां तक ​​मैं कह सकता हूं, n स्टोर करने के लिए पूर्णांक के बजाय उपयोग किया जा सकता है।

Here is a commit on github दिखा रहा है कि इस समस्या को कोड की एक अतिरिक्त पंक्ति के साथ कैसे ठीक किया जाए जो पूर्णांक n को numeric में परिवर्तित करता है। चूंकि मॉडल अपडेट किया गया है, नए बैच में पंक्तियों की संख्या पुराने n में जोड़ दी गई है, इसलिए n का प्रकार numeric रहता है।

(चेतावनी:: यह स्मृति की एक बड़ी राशि की खपत, यदि आप एक छोटे सरणी के साथ और अधिक पुनरावृत्तियों करने पर विचार

मैं इस सवाल में वर्णित त्रुटि पुन: पेश और सत्यापित करें कि मेरी ठीक इस कोड के साथ काम करता है करने में सक्षम था है तंग स्मृति की कमी)

library(biglm) 
df = as.data.frame(replicate(3, rnorm(10000000))) 
a = biglm(V1 ~ V2 + V3, df) 
for (i in 1:300) { 
    a = update(a, df) 
} 
print(summary(a)) 

मूल biglm पुस्तकालय में, इस कोड आउटपुट:

Large data regression model: biglm(ff, df) 
Sample size = NA 
       Coef (95% CI) SE p 
(Intercept) -1e-04 NA NA NA NA 
V2   -1e-04 NA NA NA NA 
V3   -2e-04 NA NA NA NA 

मेरे समझौता संस्करण आउटपुट:

Large data regression model: biglm(V1 ~ V2 + V3, df) 
Sample size = 3.01e+09 
       Coef (95% CI) SE p 
(Intercept) -3e-04 -3e-04 -3e-04 0 0 
V2   -2e-04 -2e-04 -1e-04 0 0 
V3   3e-04 3e-04 3e-04 0 0 

एसई और पी मान शून्य-शून्य हैं, जो उपरोक्त आउटपुट में गोलाकार हैं।

मैं आर पारिस्थितिक तंत्र के लिए काफी नया हूं, इसलिए अगर कोई मुझे बता सकता है कि कोई इस पैच को कैसे सबमिट कर सकता है तो इसकी सराहना की जाएगी ताकि इसकी समीक्षा मूल लेखक द्वारा की जा सके और अंततः अपस्ट्रीम पैकेज में शामिल हो।

+0

दुर्भाग्य से biglm पैकेज को त्यागना प्रतीत होता है; अंतिम रिलीज 4 साल पहले था। सौभाग्य से जब यह खुला स्रोत है, तो कोई भी आपका परिवर्तन ले सकता है और इसे अपने सिस्टम (+1) पर संकलित कर सकता है। –

+0

वाह, यह बहुत अच्छा है। मदद के लिए आपका बहुत बहुत धन्यवाद! इसका मतलब है कि मेरे लिए बहुत कुछ है, और मुझे आशा है कि यह बड़े डेटा के साथ काम करने वाले अन्य लोगों के लिए सहायक हो सकता है :) – Eunice

+1

स्वचालित नहीं है, लेकिन एक तेज़ समाधान 'biglm <- edit (biglm)' का उपयोग करना होगा और अपने फिक्स 'रावल में जोड़ें $ n <-as.numeric (rval $ n) 'रावल के ठीक बाद <- सूची (...)' – rawr

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