2012-07-19 14 views
17

मैं दो डेटाफ्रेम मर्ज करने की कोशिश कर रहा हूं: एक में 33 चर के 908450 अवलोकन हैं, और दूसरे में 2 चर के 908450 अवलोकन हैं।आर में स्मृति सीमा से अधिक (यहां तक ​​कि 24 जीबी रैम के साथ)

dataframe2 <-merge(dataframe1, dataframe2, by="id") 

मैं काम कर स्मृति से अन्य सभी dataframes साफ़ कर दिया है, और (रैम 24 GB के साथ एक नया डेस्कटॉप के लिए) मेरी स्मृति सीमा रीसेट कोड का उपयोग:

memory.limit(24576) 

लेकिन, मैं मुझे अभी भी त्रुटि Cannot allocate vector of size 173.Mb मिल रही है।

इस समस्या को हल करने के तरीके पर कोई विचार?

+4

पैकेज 'data.table' बहुत तेजी से' data.frames' के बाद से यह डेटा की कम प्रतियां बनाता है अधिक स्मृति कुशल और भी बहुत कुछ हो सकता है। – Chase

+2

क्या आप वास्तव में 24 जीबी का उपयोग कर रहे हैं, और संबंधित, क्या आपका 64 बिट है? –

+0

ओएस को आर को संगत स्मृति की आवश्यक मात्रा आवंटित करने में सक्षम होना चाहिए। इसलिए आप अपने द्वारा चलाए जा रहे अन्य एप्लिकेशन द्वारा सीमित हो सकते हैं। – James

उत्तर

21

करने के लिए (* nix मशीनों पर समायोज्य हो सकता है) मेरी टिप्पणियों का पालन करें, data.table का उपयोग करें। मैंने आपके डेटा से मेल खाने वाला एक त्वरित उदाहरण दिखाया है:

library(data.table) 

dt1 <- data.table(id = 1:908450, matrix(rnorm(908450*32), ncol = 32)) 
dt2 <- data.table(id = 1:908450, rnorm(908450)) 
#set keys 
setkey(dt1, id) 
setkey(dt2, id) 
#check dims 
> dim(dt1) 
[1] 908450  33 
> dim(dt2) 
[1] 908450  2 
#merge together and check system time: 
> system.time(dt3 <- dt1[dt2]) 
    user system elapsed 
    0.43 0.03 0.47 

इसलिए इसे एक साथ विलय करने के लिए 1/2 सेकंड से भी कम समय लगा। मैंने अपनी याददाश्त को देखकर स्क्रीनशॉट से पहले और बाद में लिया। विलय से पहले, मैं 3.4 गीगा रैम का उपयोग कर रहा था। जब मैं एक साथ विलय हो गया, तो यह 3.7 तक पहुंच गया और बंद हो गया। मुझे लगता है कि इससे कुछ और स्मृति या समय कुशल होने के लिए आपको कठोर दबाव डाला जाएगा।

से पहले: enter image description here

के बाद: enter image description here

+0

हाय वहाँ - त्वरित सवाल। मैंने अपने डेटाफ्रेम को डेटा डेटा में 'dat1_table <-data.table (data1)' और 'dat2_table <-data.table (data2) 'का उपयोग करके बदल दिया। लेकिन फिर, जब मैं सेटकी को आज़माता हूं, तो मुझे त्रुटि मिलती है 'कॉलम 2 लंबाई 9 है जो कॉलम 1 की लंबाई से अलग है। पंक्तियों की संख्या 'dim()' का उपयोग कर समान दिखाई देती है। – roody

+0

@roody - यह अजीब है। मैंने अभी उन्हें डेटा बनाकर ऊपर दिए गए उदाहरणों का उपयोग करके परीक्षण किया है। पहले फ्रेम, फिर अपनी विधि का उपयोग कर डेटा.tables में कनवर्ट करना। मैं त्रुटि को पुन: उत्पन्न करने में सक्षम नहीं हूं। क्या आप सुनिश्चित हैं कि 'data1' और 'data2' वास्तव में डेटा.फ्रेम हैं? आप 'वर्ग()', या 'str()' या 'is.data.frame()' के साथ जांच सकते हैं। जब आप एक कमांड में data.table बनाते हैं, तो आप कुंजी को सेट करने का प्रयास भी कर सकते हैं, यानी 'dt <- data.table (yourDF, key =" yourKey ")' – Chase

+0

हाय चेस - स्पष्ट रूप से दिनांक-समय चर डेटासेट चीजों को चकित कर रहा था। और यह सब काम किया! आपको बहुत - बहुत धन्यवाद! – roody

2

जहां तक ​​मेरा वहाँ तीन समाधान है के बारे में सोच सकते हैं:

  • उपयोग datatables
  • उपयोग स्वैप स्मृति
  • उपयोग नमूना
संबंधित मुद्दे