2011-12-21 13 views
6

मैंने एक बड़ी फ़ाइल और एक छोटी मर्ज करने की कोशिश कर दीवार को मारा है। मेरे पास readmany आर में स्मृति प्रबंधन के बारे में अन्य पोस्ट हैं, और इसे हल करने के तरीके को गैर-चरम (64 बिट पर जाएं, क्लस्टर पर अपलोड करें) आदि नहीं ढूंढ पाए हैं। मैंने बड़े पैमाने पर पैकेज के साथ थोड़ा सा प्रयास किया है, लेकिन समाधान खोजने में सक्षम नहीं है। मैंने सोचा कि मैं निराशा में अपने हाथ फेंकने से पहले यहां कोशिश करूँगा।बिग मर्ज/मेमोरी प्रबंधन

कोड मैं चल रहा हूँ नीचे की तरह है:

#rm(list=ls()) 
localtempdir<- "F:/Temp/" 
memory.limit(size=4095) 
[1] 4095 
    memory.size(max=TRUE) 
[1] 487.56 
gc() 
     used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 170485 4.6  350000 9.4 350000 9.4 
Vcells 102975 0.8 52633376 401.6 62529185 477.1 

client_daily<-read.csv(paste(localtempdir,"client_daily.csv",sep=""),header=TRUE) 
object.size(client_daily) 
>130MB 

sbp_demos<-read.csv(paste(localtempdir,"sbp_demos",sep="")) 
object.size(demos) 
>0.16MB 
client_daily<-merge(client_daily,sbp_demos,by.x="OBID",by.y="OBID",all.x=TRUE) 
Error: cannot allocate vector of size 5.0 MB 

मुझे लगता है मैं पूछ रहा हूँ वहाँ इस जो नए हार्डवेयर खरीदने शामिल नहीं है के आसपास किसी भी चालाक तरीके हैं?

  1. मुझे एक बड़ी वस्तु बनाने के लिए merge करने में सक्षम होना चाहिए।
  2. मुझे उस बड़ी वस्तु के साथ रिग्रेशन आदि करने की आवश्यकता होगी।

क्या मुझे छोड़ देना चाहिए? क्या बड़े पैमाने पर इसे हल करने में मदद करने में सक्षम होना चाहिए?

किसी भी मार्गदर्शन की सराहना की।

विवरण: आर संस्करण 2.13.1 (2011-07-08) प्लेटफार्म: i386-पीसी-mingw32/i386 (32-बिट) इंटेल कोर 2 डुओ @ 2.33GHz, 3.48GB रैम

+4

क्या आपने 'data.table' पैकेज देखा है? यह बड़े विलय के लिए * तेज़ * है, और संयोग से बूट करने के लिए अधिक स्मृति कुशल हो सकता है? – Chase

+0

यह शायद आपकी समस्या का समाधान यहाँ नहीं होगा, लेकिन कुछ तुम कोशिश कर सकते है। में डेटा को पढ़ने के बाद उन्हें हटाने, एक जी सी() करते हैं, और फिर मर्ज पुन: प्रयास करें: यदि या तो डेटा सेट जो आप की जरूरत नहीं है किसी भी स्तंभ हैं। एक और विचार है, यदि संभव हो तो एक मैट्रिक्स के लिए अपने डेटा कन्वर्ट करने के लिए के रूप में वे कम स्मृति का प्रयोग होता हैं। – Rguy

उत्तर

8

जैसा कि चेस पहले ही उल्लेख किया गया है, आप data.table या शायद sqldf आज़मा सकते हैं।

या तो एक के लिए, आप की संभावना को इससे बाहर अधिक रस मिलता है अगर आप अनुक्रमित उचित रूप से सेट हो जाएगा।

data.table तुम करोगी साथ

:

dt1 <- data.table(sbp_demos, key='OBID') 
dt2 <- data.table(client_daily, key='OBID') 

## Do an INNER JOIN-like operation, where non-matching rows are removed 
mi <- dt1[dt2, nomatch=0] 

## Do a RIGHT JOIN(?)-like operation ... all rows in dt2 will be returned. 
## If there is no matching row in dt1, the values in the dt1 columns for 
## the merged row will be NA 
mr <- dt1[dt2] 

तुम जाओ तो sqldf मार्ग, look at example 4i on its website ... फिर, सुनिश्चित करें कि आप अनुक्रमित सही ढंग से उपयोग करें।

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