আর মেমরি পরিচালনা / আকারের ভেক্টর এন এমবি বরাদ্দ করতে পারে না


149

আমি আর-তে বড় বড় অবজেক্টগুলি ব্যবহার করার চেষ্টা করে যাচ্ছি example উদাহরণস্বরূপ:

> 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 এমবি বরাদ্দ করতে পারি না ... আমি সত্যিই ব্লকটির প্রাক-বরাদ্দ করতে পারি না কারণ অন্যান্য প্রসেসিংয়ের জন্য আমার স্মৃতি দরকার। এমনকি আমি যখন অবিচ্ছিন্নভাবে অপ্রয়োজনীয় বস্তুগুলি সরিয়ে ফেলি তখনও এটি ঘটে।

সম্পাদনা: হ্যাঁ, দুঃখিত: উইন্ডোজ এক্সপি এসপি 3, 4 জিবি র‌্যাম, আর 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
@ মনোয়েল গাল্ডিনো: 'ফ্রি' কী? একটি আর ফাংশন?
বেনিয়ামিন

3
@ ম্যানোয়েল: আর-তে, মেমরি মুক্ত করার কাজটি ব্যবহারকারীর দ্বারা নয়, আবর্জনা সংগ্রহকারী দ্বারা পরিচালিত হয়। যদি সি স্তরে কাজ করা হয় তবে ম্যানুয়ালি Callocএবং Freeমেমরির পক্ষে কেউ পারেন তবে আমি সন্দেহ করি যে এটি বেঞ্জামিন করছেন না।
শার্পি

XML লাইব্রেরিতে আপনি বিনামূল্যে ব্যবহার করতে পারেন। ডকুমেন্টেশন থেকে: "এই জেনেরিক ফাংশনটি প্রদত্ত বস্তুর সাথে সম্পর্কিত মেমরিটি স্পষ্টভাবে প্রকাশের জন্য উপলব্ধ। নেটিভ অবজেক্ট। "
মনোয়েল গাল্ডিনো

উত্তর:


78

আপনার সত্যিকারের এই সমস্ত ডেটা স্পষ্টভাবে প্রয়োজন কিনা তা বিবেচনা করুন, বা ম্যাট্রিক্স বিচ্ছিন্ন হতে পারে? আর এ Matrixস্প্রেস ম্যাট্রিক্সের জন্য প্যাকেজ দেখুন ( যেমন প্যাকেজ দেখুন ) ভাল সমর্থন রয়েছে ।

আর এই সমস্ত আকারের অবজেক্ট তৈরি করার দরকার হলে অন্য সমস্ত প্রক্রিয়া এবং অবজেক্টগুলিকে সর্বনিম্ন রাখুন। gc()এখন অব্যবহৃত মেমোরি সাফ করার জন্য ব্যবহার করুন , বা কেবলমাত্র একটি সেশনে আপনার প্রয়োজনীয় অবজেক্টটি তৈরি করুন

উপরেরটি যদি সহায়তা না করতে পারে তবে আপনার সাধ্যমতো র‌্যাম সহ একটি 64-বিট মেশিন পান এবং 64-বিট আর ইনস্টল করুন

আপনি যদি এটি না করতে পারেন তবে দূরবর্তী কম্পিউটিংয়ের জন্য অনেকগুলি অনলাইন পরিষেবা রয়েছে।

আপনি যদি এটি না করতে পারেন তবে প্যাকেজের মতো মেমরি-ম্যাপিং সরঞ্জামগুলি ff(বা bigmemoryসাসাচের উল্লেখ হিসাবে) আপনাকে একটি নতুন সমাধান তৈরি করতে সহায়তা করবে। আমার সীমিত অভিজ্ঞতায় ffআরও উন্নত প্যাকেজ, তবে আপনার High Performance ComputingCRAN টাস্ক ভিউগুলিতে বিষয়টি পড়া উচিত ।


1
কাজটি র্যান্ডমফোরেস্ট সহ চিত্রের শ্রেণিবিন্যাস। আমার ট্রেনিং ডেটা (60 ব্যান্ড পর্যন্ত) এবং 20,000 থেকে 6,000,000 সারি থেকে র্যান্ডমফোরস্টে খাওয়ার জন্য একটি ম্যাট্রিক্স থাকা দরকার। বর্তমানে, আমি প্রায় 150,000 সারিতে সর্বাধিক আউট আউট করেছি কারণ ফলাফল হিসাবে র্যান্ডমফোরস্ট অবজেক্টটি ধরে রাখতে আমার একটি সংকীর্ণ ব্লক প্রয়োজন ... এটি কারণেই বিগমেমোরি সহায়তা করে না, কারণ এলোমেলোভাবে একটি ম্যাট্রিক্স অবজেক্ট প্রয়োজন।
বেনিয়ামিন

"শুধুমাত্র একটি সেশনে আপনার প্রয়োজনীয় জিনিসটি তৈরি করুন" এর অর্থ কী?
বেনিয়ামিন

কেবল একবার 'একটি' তৈরি করুন, যদি আপনি
ভুলটি পান

1
আমি এটি যুক্ত করব যে বৃহত লুপগুলি ধারণ করে এমন প্রোগ্রামগুলির জন্য যেখানে প্রচুর গণনা করা হয় তবে আউটপুট তুলনামূলকভাবে কম হয়, লুপের অভ্যন্তরীণ অংশটিকে রুপ্রিপ্টের মাধ্যমে কল করা (একটি BASH বা পাইথন স্ক্রিপ্ট থেকে) আরও স্মৃতি-দক্ষ হতে পারে , এবং ফলাফল আলাদা স্ক্রিপ্টে পরে একত্রিত / সংগ্রহ করে। এইভাবে, প্রতিটি পুনরাবৃত্তির পরে স্মৃতি সম্পূর্ণরূপে মুক্ত হয়। লুপটিতে ভেরিয়েবলগুলি পুনরায় লোডিং / পুনরায় গণনা করা থেকে কিছুটা অপচয়যোগ্য গণনা রয়েছে তবে কমপক্ষে আপনি মেমরির সমস্যাটি পেতে পারেন।
বেনিয়ামিন

54

উইন্ডোজ ব্যবহারকারীদের জন্য, কিছু স্মৃতি সীমাবদ্ধতা বুঝতে নিম্নলিখিতগুলি আমাকে অনেক বেশি সহায়তা করেছে:

  • আর। খোলার আগে উইন্ডোজ রিসোর্স মনিটরটি খুলুন (সিটিআরএল-আল্ট-ডিলিট / স্টার্ট টাস্ক ম্যানেজার / পারফরম্যান্স ট্যাব / নীচে বোতামে ক্লিক করুন 'রিসোর্স মনিটর' / মেমরি ট্যাব)
  • আপনি আর কে খোলার আগে ইতিমধ্যে আমাদের কতটা র‌্যাম মেমরি ব্যবহার করেছেন এবং কোন অ্যাপ্লিকেশন দ্বারা তা দেখতে পাবেন। আমার ক্ষেত্রে, মোট 4 জিবি-র 1.6 জিবি ব্যবহৃত হয়। সুতরাং আমি কেবল আর এর জন্য ২.৪ জিবি পেতে সক্ষম হব, তবে এখন আরও খারাপ ...
  • আর খুলুন এবং 1.5 গিগাবাইটের একটি ডেটা সেট তৈরি করুন, তার আকারটি 0.5 গিগাবাইটে কমিয়ে আনুন, রিসোর্স মনিটর দেখায় যে আমার র্যামটি প্রায় 95% ব্যবহার করা হয়েছে।
  • gc()আবর্জনা সংগ্রহ করতে ব্যবহার করুন => এটি কাজ করে, আমি দেখতে পাচ্ছি মেমরির ব্যবহারটি 2 জিবিতে নেমে গেছে

এখানে চিত্র বর্ণনা লিখুন

অতিরিক্ত পরামর্শ যা আমার মেশিনে কাজ করে:

  • বৈশিষ্ট্যগুলি প্রস্তুত করুন, একটি আরডিটা ফাইল হিসাবে সংরক্ষণ করুন, আর বন্ধ করুন, পুনরায় খুলুন এবং ট্রেনের বৈশিষ্ট্যগুলি লোড করুন। রিসোর্স ম্যানেজার সাধারণত একটি কম মেমোরি ব্যবহার দেখায়, যার অর্থ জিসি () এমনকি সমস্ত সম্ভাব্য মেমরি পুনরুদ্ধার করে না এবং বন্ধ / পুনরায় খোলার মাধ্যমে সর্বাধিক স্মৃতি উপলব্ধ হয়ে শুরু করতে সবচেয়ে ভাল কাজ করে
  • অন্য কৌশলটি হ'ল প্রশিক্ষণের জন্য ট্রেন সেট লোড করা (পরীক্ষার সেটটি লোড করবেন না, যা সাধারণত ট্রেনের সেটের অর্ধেক আকারের হতে পারে)। প্রশিক্ষণ পর্বটি সর্বাধিক (100%) মেমরি ব্যবহার করতে পারে, তাই যে কোনও কিছুই কার্যকর। আমি আর মেমরির সীমা নিয়ে পরীক্ষা করছি বলে এই সমস্ত লবণের দানা নিয়ে নেওয়া।

9
আর নিজেরাই আবর্জনা সংগ্রহ করেন, gc()এটি একটি মায়া মাত্র। টাস্ক ম্যানেজারটি পরীক্ষা করা ঠিক খুব সাধারণ উইন্ডোজ অপারেশন। আমি একমাত্র পরামর্শের সাথে একমত হতে পারি .RData ফর্ম্যাটটি সংরক্ষণ করুন
ডেভিড আরেনবুর্গ

3
@ ডেভিড আরেনবুর্গ জিসি () একটি মায়া? এর অর্থ হ'ল আমার উপরের ছবিটি মেমরির ব্যবহারের ড্রপ দেখানো একটি বিভ্রম। আমি মনে করি আপনি ভুল, কিন্তু আমার ভুল হতে পারে।
টিমোথে হেনরি

4
আমি বোঝাতে চাইনি যে gc()এটি কাজ করে না। আমি কেবল বোঝাতে চাইছি যে এটি এটি স্বয়ংক্রিয়ভাবে করে। সুতরাং আপনাকে এটি ম্যানুয়ালি করার দরকার নেই। এখানে
ডেভিড আরেনবার্গ

2
@ ডেভিড আরেনবুর্গ আমি আপনাকে একটি সত্যের জন্য বলতে পারি যে উপরের ছবিতে মেমরির ব্যবহারের ড্রপটি জিসি () কমান্ডের কারণে হয়েছে। আপনি যে ডকটিকে নির্দেশ করেছেন সেটি সঠিক বলে আমি বিশ্বাস করি না, কমপক্ষে আমার সেটআপের জন্য নয় (উইন্ডোজ, আর সংস্করণ 3.1.0 (2014-04-10) প্ল্যাটফর্ম: i386-w64-mingw32 / i386 (32-বিট))।
টিমোথে হেনরি

15
ঠিক আছে, শেষ বারের জন্য gc() নেই কাজ। আপনার কেবল এটি ব্যবহার করার দরকার নেই কারণ এটি অভ্যন্তরীণভাবে কাজ করে
ডেভিড আরেনবুর্গ

16

এখানে এই বিষয়টির একটি উপস্থাপনা যা আপনাকে আকর্ষণীয় মনে করতে পারে:

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

আমি নিজে আলোচিত জিনিসগুলি চেষ্টা করে দেখিনি, তবে bigmemoryপ্যাকেজটি খুব দরকারী বলে মনে হচ্ছে


4
ওয়ার্কস ছাড়া একটি ম্যাট্রিক্স বর্গ বলে আশা করা হচ্ছে যখন (এবং big.matrix)
বেঞ্জামিন

14

এই সীমাবদ্ধতার পাশ কাটিয়ে যাওয়ার সহজ উপায় হ'ল 64 বিট আর তে স্যুইচ করা is


25
এটি সাধারণভাবে নিরাময় নয় - আমি স্যুইচ করেছি, এবং এখন আমার Error: cannot allocate vector of size ... Gbপরিবর্তে রয়েছে (তবে হ্যাঁ, আমার কাছে প্রচুর ডেটা রয়েছে)।
ওম-নাম-মনোনীত

2
সম্ভবত নিরাময় না হলেও এটি প্রচুর সাহায্য করে। কেবল র‍্যামে লোড করুন এবং মেমরি.ক্রিট করুন () keep অথবা, সম্ভবত আপনার ডেটা ভাগ / স্যাম্পলিং সম্পর্কে ভাবেন।
র্যান্ডম_ফরেস্ট_ফ্যান্যাটিক

এমনকি যদি আপনি 64৪-বিটে এমনকি মূলত সীমাহীন এটিতেও সমস্যা হয় তবে সম্ভবত এটি আরও বেশি কিছু যে আপনি সত্যিই বিশাল কিছু বরাদ্দ দেওয়ার চেষ্টা করছেন। তাত্ত্বিকভাবে আপনি ভেক্টর কত বড় হওয়া উচিত তা গণনা করেছেন? অন্যথায়, এটি হতে পারে যে আপনার কম্পিউটারে আরও বেশি র‌্যামের প্রয়োজন, তবে আপনার কাছে কেবলমাত্র এত কিছুই থাকতে পারে।
hangmanwa7id

দেয়ালের বিপরীতে আরও বেশি সমাধানের আগে এর মতো সহজ সমাধানগুলি ব্যবহার করে দেখতে ভাল লাগছে। ধন্যবাদ।
নোভা

তদুপরি, এটি উইন্ডোজের সাথে একচেটিয়াভাবে সমস্যা নয়। আমি বর্তমানে উবুন্টুতে চলছে, Mat৪-বিট আর, ম্যাট্রিক্স ব্যবহার করছি এবং একটি 20048 x 96448 ম্যাট্রিক্স অবজেক্টটি পরিচালনা করতে অসুবিধা হচ্ছে।

12

আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি এবং আমি 2 টি ফ্ল্যাশ ড্রাইভকে 'রেডি বুস্ট' হিসাবে ব্যবহার করেছি। দুটি ড্রাইভ অতিরিক্ত 8 জিবি মেমরি বাড়িয়েছে (ক্যাশের জন্য) এবং এটি সমস্যার সমাধান করেছে এবং সামগ্রিকভাবে সিস্টেমের গতিও বাড়িয়েছে। রেডিবুস্ট ব্যবহার করতে, ড্রাইভে ডান ক্লিক করুন, বৈশিষ্ট্যগুলিতে যান এবং 'রেডি বুস্ট' নির্বাচন করুন এবং 'এই ডিভাইসটি ব্যবহার করুন' রেডিও বোতামটি নির্বাচন করুন এবং কনফিগার করার জন্য প্রয়োগ বা ঠিক আছে ক্লিক করুন।


11

আমি মেমোর.লিমিটের সহায়তার পৃষ্ঠায় চলেছি এবং জানতে পেরেছি যে আমার কম্পিউটারে আর ডিফল্টরূপে র‌্যামের 1.5 ডলার অবধি ব্যবহার করতে পারে এবং ব্যবহারকারী এই সীমাটি বাড়িয়ে দিতে পারে। নিম্নলিখিত কোড ব্যবহার করে,

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

আমার সমস্যা সমাধানে আমাকে সাহায্য করেছে।


1
কেন এটিকে ভোট দেওয়া হচ্ছে? অবশ্যই, এটি একটি বিপজ্জনক পদ্ধতির, তবে এটি প্রায়শই সাহায্য করতে পারে যদি এটির কাজ করার জন্য সেশনটিতে আরও কিছুটা মেমরি বরাদ্দ করা প্রয়োজন।
জেপে ওলসেন

3
এটি কেবল একটি উইন্ডোজ নির্দিষ্ট সমাধান
জিনুয়া ওয়াং

9

আপনি যদি লিনাক্স পরিবেশে আপনার স্ক্রিপ্টটি চালাচ্ছেন তবে আপনি এই আদেশটি ব্যবহার করতে পারেন:

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

এবং সার্ভারটি আপনার জন্য অনুরোধ করা মেমরি বরাদ্দ করবে (সার্ভারের সীমা অনুসারে, তবে ভাল সার্ভারের সাথে - বিশাল ফাইলগুলি ব্যবহার করা যেতে পারে)


1
আমি কি এটি একটি আমাজন ইসি 2 উদাহরণে ব্যবহার করতে পারি? যদি তা হয় তবে আমি কিসের জায়গায় রাখব server_name? আমি cannot allocate vector size...এএমআই-তে একটি বিশাল ডকুমেন্ট-টার্ম ম্যাট্রিক্স করার চেষ্টা করে এটিকে চালিয়ে যাচ্ছি এবং কেন এটির পর্যাপ্ত মেমরি নেই, বা আমাকে আরও কত ভাড়া দিতে হবে তা আমি বুঝতে পারি না। ধন্যবাদ!
seth127

আমি উবুন্টু শিক্ষানবিস এবং এটিতে রস্তুদিও ব্যবহার করছি। আমার 16 জিবি র‌্যাম রয়েছে। উত্তরে আপনার প্রদর্শিত প্রক্রিয়াটি আমি কীভাবে প্রয়োগ করব। ধন্যবাদ
রানজাম্পফ্লাই

3

উপরে উল্লিখিত সেভ / লোড পদ্ধতিটি আমার পক্ষে কাজ করে। আমি নিশ্চিত না / কীভাবে gc()মেমরিটিকে অস্বীকার করে তবে এটি কাজ করে বলে মনে হচ্ছে।

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.