स्मृति प्रबंधन / वेक्टर का आकार n एमबी आवंटित नहीं कर सकता


149

मैं आर में बड़ी वस्तुओं का उपयोग करने की कोशिश कर रहे मुद्दों में भाग रहा हूं। उदाहरण के लिए:

> memory.limit(4000)
> a = matrix(NA, 1500000, 60)
> a = matrix(NA, 2500000, 60)
> a = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb
> a = matrix(NA, 2500000, 60)
Error: cannot allocate vector of size 572.2 Mb # Can't go smaller anymore
> rm(list=ls(all=TRUE))
> a = matrix(NA, 3500000, 60) # Now it works
> b = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb # But that is all there is room for

मैं समझता हूं कि यह स्मृति के सन्निहित ब्लॉकों को प्राप्त करने की कठिनाई से संबंधित है ( यहाँ से ):

त्रुटि संदेश शुरू करने वाले आकार के वेक्टर को आवंटित नहीं कर सकते हैं या तो स्मृति प्राप्त करने में विफलता का संकेत देते हैं, या तो क्योंकि आकार एक प्रक्रिया के लिए पता-स्थान की सीमा को पार कर गया है या अधिक संभावना है, क्योंकि सिस्टम मेमोरी प्रदान करने में असमर्थ था। ध्यान दें कि 32-बिट बिल्ड पर अच्छी तरह से उपलब्ध मुफ्त मेमोरी हो सकती है, लेकिन पता स्थान का एक बड़ा पर्याप्त सन्निहित ब्लॉक नहीं है जिसमें इसे मैप करना है।

मैं इसके पास कैसे आ सकता हूं? मेरी मुख्य कठिनाई यह है कि मुझे अपनी स्क्रिप्ट में एक निश्चित बिंदु मिलता है और आर किसी वस्तु के लिए 200-300 एमबी आवंटित नहीं कर सकता है ... मैं वास्तव में ब्लॉक को पूर्व-आवंटित नहीं कर सकता क्योंकि मुझे अन्य प्रसंस्करण के लिए मेमोरी की आवश्यकता है। ऐसा तब भी होता है जब मैं बेकार की वस्तुओं को हटा देता हूं।

संपादित करें: हाँ, क्षमा करें: Windows XP SP3, 4Gb RAM, R 2.12.0:

> sessionInfo()
R version 2.12.0 (2010-10-15)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_Caribbean.1252  LC_CTYPE=English_Caribbean.1252   
[3] LC_MONETARY=English_Caribbean.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Caribbean.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

उपयोग नहीं की गई अन्य प्रक्रिया की स्मृति को कम करने के लिए 'मुक्त' का उपयोग करने का प्रयास करें।
मैनेल गेल्डिनो

5
@ Manoel Galdino: 'फ्री' क्या है? एक आर समारोह?
बेंजामिन

3
@ मैनल: आर में, मेमोरी को खाली करने का कार्य कचरा संग्राहक द्वारा संभाला जाता है, उपयोगकर्ता नहीं। यदि सी स्तर पर काम कर रहा है, तो कोई भी मैन्युअल रूप से Callocऔर Freeमेमोरी कर सकता है , लेकिन मुझे संदेह है कि यह बेंजामिन क्या नहीं कर रहा है।
शार्प

लाइब्रेरी एक्सएमएल में आप मुफ्त का उपयोग कर सकते हैं। प्रलेखन से: "यह जेनेरिक फ़ंक्शन दिए गए ऑब्जेक्ट से जुड़ी मेमोरी को स्पष्ट रूप से जारी करने के लिए उपलब्ध है। यह बाहरी पॉइंटर ऑब्जेक्ट्स पर उपयोग के लिए अभिप्रेत है, जिसमें एक स्वचालित फाइनल फ़ंक्शन / दिनचर्या नहीं होती है जो उस मेमोरी को साफ करती है जो उपयोग की गई मेमोरी को साफ करती है। देशी वस्तु। "
मैनल गेलिडिनो

जवाबों:


78

विचार करें कि क्या आपको वास्तव में स्पष्ट रूप से इस सभी डेटा की आवश्यकता है, या मैट्रिक्स को विरल किया जा सकता है? Matrixविरल मैट्रिसेस के लिए R ( उदाहरण के लिए पैकेज देखें ) में अच्छा समर्थन है ।

अन्य सभी प्रक्रियाओं और वस्तुओं को आर में न्यूनतम रखें जब आपको इस आकार की वस्तुओं को बनाने की आवश्यकता होती है। gc()अब अप्रयुक्त मेमोरी को खाली करने के लिए उपयोग करें , या, केवल एक सत्र में आपको आवश्यक वस्तु बनाएं

यदि उपरोक्त मदद नहीं कर सकता है, तो एक 64-बिट मशीन प्राप्त करें जितनी रैम आपके पास हो, और 64-बिट आर स्थापित करें।

यदि आप ऐसा नहीं कर सकते हैं तो दूरस्थ कंप्यूटिंग के लिए कई ऑनलाइन सेवाएं हैं।

यदि आप ऐसा नहीं कर सकते हैं तो मेमोरी-मैपिंग टूल जैसे पैकेज ff(या bigmemoryसाशा उल्लेख के अनुसार) आपको एक नया समाधान बनाने में मदद करेंगे। मेरे सीमित अनुभव ffमें अधिक उन्नत पैकेज है, लेकिन आपको High Performance ComputingCRAN Task Views पर विषय को पढ़ना चाहिए ।


1
कार्य यादृच्छिक के साथ छवि वर्गीकरण है। मुझे यादृच्छिक डेटा को फीड करने के लिए प्रशिक्षण डेटा (60 बैंड तक) और कहीं भी 20,000 से 6,000,000 पंक्तियों का एक मैट्रिक्स होना चाहिए। वर्तमान में, मैं लगभग 150,000 पंक्तियों में अधिकतम करता हूं क्योंकि मुझे परिणामी रैंडम फ़ॉरेस्ट ऑब्जेक्ट को होल्ड करने के लिए एक सन्निहित ब्लॉक की आवश्यकता होती है ... जो कि बिगमेमोरी भी मदद नहीं करता है, क्योंकि रैंडम फ़ोरेस्ट को मैट्रिक्स ऑब्जेक्ट की आवश्यकता होती है।
बेंजामिन

"केवल एक सत्र में आपकी आवश्यकता की वस्तु बनाएं" से आपका क्या अभिप्राय है?
बेंजामिन

केवल एक बार 'a' बनाएं, अगर आपको गलत लगे तो पहली बार एक नया सत्र शुरू करें
mdsumner

1
मैं उन कार्यक्रमों के लिए जोड़ूंगा जिनमें बड़े लूप होते हैं जहां बहुत अधिक संगणना की जाती है लेकिन आउटपुट अपेक्षाकृत छोटा होता है, यह लूप के आंतरिक भाग को रूपक (BASH या पायथन स्क्रिप्ट से) के माध्यम से कॉल करने के लिए अधिक मेमोरी-कुशल हो सकता है। , और एक अलग स्क्रिप्ट में बाद में परिणामों को समेटना / एकत्र करना। इस तरह, मेमोरी प्रत्येक पुनरावृत्ति के बाद पूरी तरह से मुक्त हो जाती है। लूप को पास किए गए चर को फिर से लोड / री-कंप्यूटिंग से व्यर्थ की गणना का एक सा है, लेकिन कम से कम आप स्मृति मुद्दे के आसपास प्राप्त कर सकते हैं।
बेंजामिन

54

विंडोज उपयोगकर्ताओं के लिए, निम्नलिखित ने मुझे कुछ मेमोरी सीमाओं को समझने में बहुत मदद की:

  • आर खोलने से पहले, विंडोज रिसोर्स मॉनिटर (Ctrl-Alt-Delete / Start टास्क मैनेजर / प्रदर्शन टैब खोलें / नीचे बटन पर क्लिक करें 'संसाधन मॉनिटर' / मेमोरी टैब)
  • आप देखेंगे कि आर खोलने से पहले ही हम कितनी मेमोरी का उपयोग कर चुके हैं, और किन अनुप्रयोगों के द्वारा। मेरे मामले में, कुल 4 जीबी में से 1.6 जीबी का उपयोग किया जाता है। तो मैं केवल R के लिए 2.4 GB प्राप्त कर पाऊंगा, लेकिन अब इससे भी बदतर ...
  • R खोलें और 1.5 GB का डेटा सेट बनाएं, फिर इसका आकार 0.5 GB तक कम करें, संसाधन मॉनिटर से पता चलता है कि मेरी RAM का उपयोग लगभग 95% है।
  • gc()कचरा संग्रह करने के लिए उपयोग => यह काम करता है, मैं मेमोरी उपयोग को 2 जीबी तक नीचे जाते देख सकता हूं

यहाँ छवि विवरण दर्ज करें

अतिरिक्त सलाह जो मेरी मशीन पर काम करती है:

  • सुविधाएँ तैयार करें, RData फ़ाइल के रूप में सहेजें, R को बंद करें, R को फिर से खोलें और ट्रेन सुविधाओं को लोड करें। संसाधन प्रबंधक आमतौर पर कम मेमोरी उपयोग दिखाता है, जिसका अर्थ है कि जीसी () भी सभी संभव मेमोरी को पुनर्प्राप्त नहीं करता है और आर / आर-ओपनिंग शुरू करना अधिकतम उपलब्ध मेमोरी के साथ शुरुआत करने के लिए सबसे अच्छा काम करता है
  • दूसरी चाल केवल प्रशिक्षण के लिए ट्रेन सेट को लोड करना है (परीक्षण सेट को लोड न करें, जो आमतौर पर ट्रेन सेट का आधा आकार हो सकता है)। प्रशिक्षण चरण अधिकतम (100%) तक मेमोरी का उपयोग कर सकता है, इसलिए उपलब्ध कुछ भी उपयोगी है। यह सब नमक के एक दाने के साथ लेना है क्योंकि मैं आर मेमोरी सीमा के साथ प्रयोग कर रहा हूं।

9
R अपने आप कचरा संग्रहण करता है, gc()केवल एक भ्रम है। कार्य प्रबंधक की जाँच बस बहुत ही बुनियादी विंडोज़ ऑपरेशन है। एकमात्र सलाह जिसके साथ मैं सहमत हो सकता हूं, वह है ।Rata प्रारूप में बचत कर रहा है
डेविड आरनबर्ग

3
@DavidArenburg gc () एक भ्रम है? इसका मतलब होगा कि मेरे पास स्मृति उपयोग की गिरावट दिखाने के लिए ऊपर दी गई तस्वीर एक भ्रम है। मुझे लगता है कि आप गलत हैं, लेकिन मुझसे गलती हो सकती है।
टिमोथी हेनले

4
मेरा मतलब यह नहीं था कि gc()काम नहीं करता है। मेरा सिर्फ इतना मतलब है कि R यह स्वचालित रूप से करता है, इसलिए आपको इसे मैन्युअल रूप से करने की आवश्यकता नहीं है। यहाँ
डेविड आरनबर्ग

2
@DavidArenburg मैं आपको इस तथ्य के लिए बता सकता हूं कि ऊपर चित्र में स्मृति उपयोग की गिरावट gc () कमांड के कारण है। मुझे विश्वास नहीं है कि आप जिस बिंदु पर सही हैं, वह कम से कम मेरे सेटअप के लिए नहीं है (Windows, R संस्करण 3.1.0 (2014-04-10) प्लेटफ़ॉर्म: i386-w64-mingw32 / i386 (32-bit))।
टिमोथी हेनले

15
ठीक है, आखिरी बार। काम gc() करता है । आपको इसका उपयोग करने की आवश्यकता नहीं है क्योंकि R यह आंतरिक रूप से करता है
डेविड अर्नबर्ग

16

यहाँ इस विषय पर एक प्रस्तुति है जो आपको रोचक लग सकती है:

http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/

मैंने स्वयं चर्चा की गई चीजों की कोशिश नहीं की है, लेकिन bigmemoryपैकेज बहुत उपयोगी है


4
काम करता है, सिवाय जब एक मैट्रिक्स वर्ग की उम्मीद की जाती है (और बड़ी नहीं है। मैट्रिक्स)
बेंजामिन

14

इस सीमा को समाप्त करने का सबसे सरल तरीका 64 बिट आर पर स्विच करना है।


25
यह सामान्य रूप से इलाज नहीं है - मैंने स्विच कर दिया है, और अब मेरे पास Error: cannot allocate vector of size ... Gbइसके बजाय (लेकिन हाँ, मेरे पास बहुत डेटा है)।
om-nom-nom

2
शायद इलाज नहीं है लेकिन यह बहुत मदद करता है। बस RAM पर लोड करें और मेमोरी को क्रैक करते रहें। या, शायद अपने डेटा को विभाजित / नमूना करने के बारे में सोचें।
19_ पर यादृच्छिक_फोर्स्ट_फैनेटिक

यदि आपको 64-बिट में भी परेशानी हो रही है, जो अनिवार्य रूप से असीमित है, तो संभवतः यह अधिक है कि आप वास्तव में बड़े पैमाने पर कुछ आवंटित करने की कोशिश कर रहे हैं। क्या आपने गणना की है कि सैद्धांतिक रूप से वेक्टर कितना बड़ा होना चाहिए? अन्यथा, यह हो सकता है कि आपके कंप्यूटर को अधिक RAM की आवश्यकता हो, लेकिन आपके पास केवल इतना ही हो सकता है।
हैंगमैन 7id

अधिक सिर के खिलाफ दीवार समाधान से पहले इस तरह सरल समाधान की कोशिश करने के लिए अच्छा है। धन्यवाद।
नोवा

इसके अलावा, यह विशेष रूप से विंडोज के साथ एक समस्या नहीं है। मैं वर्तमान में उबंटू पर चल रहा हूं, मैट्रिक्स का उपयोग करके 64-बिट आर, और 20048 x 96448 मैट्रिक्स ऑब्जेक्ट में हेरफेर करने में कठिनाई हो रही है।

12

मुझे इसी तरह की समस्या का सामना करना पड़ा, और मैंने 'रेडी बूस्ट' के रूप में 2 फ्लैश ड्राइव का इस्तेमाल किया। दो ड्राइवों ने अतिरिक्त 8GB मेमोरी को बढ़ाया (कैश के लिए) और इसने समस्या को हल किया और सिस्टम की गति को भी बढ़ा दिया। रेडीबोस्ट का उपयोग करने के लिए, ड्राइव पर राइट क्लिक करें, गुणों पर जाएं और 'रेडीबॉस्ट' का चयन करें और 'इस डिवाइस का उपयोग करें' रेडियो बटन का चयन करें और कॉन्फ़िगर करने के लिए लागू करें या ठीक पर क्लिक करें।


11

मैंने memor.limit के सहायता पृष्ठ का अनुसरण किया और पाया कि मेरे कंप्यूटर पर डिफ़ॉल्ट रूप से ~ 1.5 GB RAM का उपयोग कर सकते हैं और उपयोगकर्ता इस सीमा को बढ़ा सकते हैं। निम्नलिखित कोड का उपयोग कर,

>memory.limit()
[1] 1535.875
> memory.limit(size=1800)

मेरी समस्या को हल करने में मेरी मदद की।


1
इसे क्यों वोट दिया जा रहा है? निश्चित रूप से, यह एक खतरनाक दृष्टिकोण है, लेकिन यह अक्सर मदद कर सकता है अगर काम करने के लिए सत्र के लिए बस थोड़ी अधिक स्मृति को आवंटित करने की आवश्यकता हो।
जेपी ऑलसेन

3
यह केवल एक विंडोज़ विशिष्ट समाधान है
जिंहुआ वांग

9

यदि आप अपनी स्क्रिप्ट को Linux वातावरण में चला रहे हैं, तो आप इस कमांड का उपयोग कर सकते हैं:

bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"

और सर्वर आपके लिए अनुरोधित मेमोरी को आवंटित करेगा (सर्वर सीमा के अनुसार, लेकिन अच्छे सर्वर के साथ - विशाल फाइल का उपयोग किया जा सकता है)


1
क्या मैं इसका इस्तेमाल Amazon EC2 उदाहरण पर कर सकता हूं? यदि हां, तो मैं किसके स्थान पर रखूं server_name? मैं cannot allocate vector size...एक एएमआई पर एक विशाल दस्तावेज़-टर्म मैट्रिक्स करने की कोशिश कर रहा हूं और मैं यह पता नहीं लगा सकता कि इसमें पर्याप्त मेमोरी क्यों नहीं है, या मुझे कितना किराए की आवश्यकता है। धन्यवाद!
seth127

मैं उबंटू शुरुआती हूं और उस पर Rstudio का उपयोग कर रहा हूं। मेरे पास 16 जीबी रैम है। मैं उस प्रक्रिया को कैसे लागू करता हूं जो आप उत्तर में दिखाते हैं। धन्यवाद
runjumpfly

3

ऊपर बताई गई सेव / लोड विधि मेरे लिए काम करती है। मुझे यकीन नहीं है कि कैसे / अगर gc()स्मृति को डिफ्रैग किया जाता है लेकिन यह काम करने लगता है।

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.