কম্পিউটার

আমার রুবি অ্যাপ্লিকেশনে কি ঘটছে?

আপনি যদি ভাবছেন আপনার রুবি অ্যাপ্লিকেশনের সাথে কী ঘটছে…

কোন অভিনব GUI টুল নেই৷ …

কিন্তু আমাদের কাছে অবজেক্টস্পেস মডিউল আছে!

অবজেক্টস্পেস আপনার আবেদনের বর্তমান অবস্থা সম্পর্কে তথ্য দেয়৷

আসুন এটি কীভাবে কাজ করে তা আবিষ্কার করি।

অবজেক্ট গণনা

ObjectSpace ব্যবহার করে আপনার প্রোগ্রামে বর্তমানে কোন বস্তুগুলি 'জীবিত' রয়েছে তা আপনি জানতে পারবেন।

একটি বস্তুর জীবিত থাকার মানে কি?

একটি বস্তু ততক্ষণ জীবিত থাকে যতক্ষণ না এটির দিকে ইঙ্গিতকারী কোনও রেফারেন্স থাকে। একটি রেফারেন্স হল বস্তুটি অ্যাক্সেস করার একটি উপায়, যেমন একটি পরিবর্তনশীল বা ধ্রুবক৷

যদি কোনো বস্তুর কাছে পৌঁছানো না যায় তাহলে এর মানে হল মেমরি থেকে মুছে ফেলা নিরাপদ।

উদাহরণ :

# 'নাম' ভেরিয়েবলটি 'ডেভ' স্ট্রিংটির একটি রেফারেন্স ধারণ করে। নাম ='ডেভ'# 'নাম' ভেরিয়েবলটি এখন 'জন'-এর দিকে নির্দেশ করে। নাম ='জন'

এখন ObjectSpace এর একটি উদাহরণ দেখা যাক কর্মে:

'objspace' প্রয়োজন # এটি বৈধ রুবি সিনট্যাক্স, কিন্তু irb/pryObjectSpace .each_object .inject(Hash.new 0) { |h,o| h[o.class] +=1; h } .sort_by { |k,v| -v } .নিয়ে নিন(10) .প্রতিটি { |শ্রেণী, গণনা| রাখে "#{count.to_s.ljust(10)} #{klass}" }# কপি এবং পেস্ট সংস্করণ (irb/pry এর জন্য এটি ব্যবহার করুন)ObjectSpace.each_object.inject(Hash.new 0) { |h,o| h[o.class] +=1; h }.sort_by { |k,v| -v }.নুন(10).প্রতিটি { |শ্রেণী, গণনা| রাখে "#{count.to_s.ljust(10)} #{klass}" }

এটি আপনার সেরা 10 ক্লাসের জন্য অবজেক্ট কাউন্ট সহ একটি টেবিল প্রিন্ট করবে।

গণনা ক্লাস-------------------------5436 String315 Class251 Array101 Encoding69 Regexp45 Hash26 Module25 Gem::Version22 Gem::StubSpecification::StubLine22 Gem ::স্টাব স্পেসিফিকেশন

আপনার যদি মেমরি লিক হওয়ার সন্দেহ হয় তবে আপনি প্রতি ঘন্টায় এই ডেটা লগ করতে পারেন এবং খুঁজে বের করতে পারেন যে এমন কিছু বস্তুর সংখ্যা আছে যা সব সময় বাড়তে থাকে কিন্তু কখনই কম হয় না।

অবজেক্টের সাথে মজা

ObjectSpace ব্যবহার করার সময় আপনি প্রকৃত বস্তুগুলিতে অ্যাক্সেস পান, শুধুমাত্র তাদের সম্পর্কে তথ্য নয়, তাই আপনি কিছু মজার জিনিস করতে পারেন যেমন সমস্ত স্ট্রিংয়ের মান মুদ্রণ করা বা আপনার সমস্ত File এর পথ প্রিন্ট করা বস্তু।

উদাহরণ :

ObjectSpace .each_object(String) .sort_by { |s| s.size } .প্রতিটি { |s| p s }

এটি আকার অনুসারে সাজানো সমস্ত ইন-মেমরি স্ট্রিং প্রিন্ট করবে। আপনি লক্ষ্য করবেন যে এমন অনেক স্ট্রিং আছে যা আপনি নিজে তৈরি করেননি, সেগুলি রুবি ইন্টারপ্রেটার দ্বারা তৈরি করা হয়েছে৷

ব্যবহারিক ব্যবহার?

ঠিক আছে, এটি বেশিরভাগই ডিবাগিং এবং আপনার অ্যাপ সম্পর্কে পরিসংখ্যান সংগ্রহ করার জন্য 🙂

অবজেক্ট মেমরি সাইজ

আরেকটি জিনিস যা আপনি করতে পারেন তা হল ObjectSpace.memsize_of ব্যবহার করা একটি নির্দিষ্ট বস্তুর মেমরি আকার খুঁজে পেতে.

উদাহরণ :

o ="a" * 100ObjectSpace.memsize_of(o)

একটি জিনিস মনে রাখবেন ডকুমেন্টেশন থেকে এই সতর্কতা:

"উল্লেখ্য যে রিটার্নের আকার অসম্পূর্ণ। আপনাকে এই তথ্যটি শুধুমাত্র একটি ইঙ্গিত হিসাবে মোকাবেলা করতে হবে।"

আপনি যদি বিভিন্ন ধরণের বস্তুর সাথে এই পদ্ধতিটি চেষ্টা করেন আপনি কিছু আকর্ষণীয় জিনিস পাবেন , যেমন Fixnum সবসময় 0 ফেরত দেয়।

ObjectSpace.memsize_of(42)# 0

এর কারণ হল রুবি অভ্যন্তরীণভাবে Fixnum তৈরি করে না অবজেক্ট, আপনি রুবিতে সংখ্যা সম্পর্কে যে পোস্টটি লিখেছিলেন তাতে আপনি এই সম্পর্কে আরও জানতে পারেন।

আরেকটি আকর্ষণীয় হল স্ট্রিং:

ObjectSpace.memsize_of("A" * 22)# 40ObjectSpace.memsize_of("A" * 23)# 40ObjectSpace.memsize_of("A" * 24)# 65

আমি "A" * size ব্যবহার করি এটি টাইপ না করে একটি দীর্ঘ স্ট্রিং তৈরি করার উপায় হিসাবে 🙂

অপেক্ষা করুন! এইমাত্র কি ঘটেছে?

ঠিক আছে, দেখা যাচ্ছে যে রুবিতে 24টি অক্ষরের চেয়ে ছোট স্ট্রিংগুলির জন্য একটি অন্তর্নির্মিত অপ্টিমাইজেশান রয়েছে, সেই কারণেই এর পরে মেমরির ব্যবহারে একটি লাফ রয়েছে৷ আপনি Pat Shaughnessy থেকে এই পোস্টে আরও বিস্তারিতভাবে এটি দেখতে পারেন৷

কীভাবে উপনামযুক্ত পদ্ধতিগুলি সন্ধান করবেন

রুবিতে সমস্ত উপনামযুক্ত পদ্ধতির একটি 'মাস্টার' তালিকা থাকলে কি ভাল হবে না?

ইচ্ছা মঞ্জুর!

এটি দেখুন৷ :

ক্লাস মডিউল def aliased_methods instance_methods(false) .group_by { |m| instance_method(m) } .map(&:last) .keep_if { |symbols| symbols.length> 1 } endend

আমি একটি স্ট্যাকওভারফ্লো উত্তর থেকে এই কোড পেয়েছি। এটি একটি aliased_methods সংজ্ঞায়িত করে Module এ পদ্ধতি ক্লাস, যা instance_methods ব্যবহার করে একটি ক্লাসে সংজ্ঞায়িত সমস্ত উদাহরণ পদ্ধতির একটি তালিকা পেতে পদ্ধতি।

আমি জানি এটি কিছুটা বিভ্রান্তিকর শোনাতে পারে, তবে এটি আপনার জন্য মেটাপ্রোগ্রামিং!

এখানে বাকি কোডটি রয়েছে, যা সমস্ত শ্রেণীর নামের একটি অ্যারে তৈরি করে যাতে অন্তত একটি 'জীবন্ত' বস্তু রয়েছে, তারপর এটি aliased_methods কল করে প্রতিটি ক্লাসে এবং আউটপুট প্রিন্ট করে।

বস্তু =ObjectSpace.each_object.map(&:class).uniqobjects.each do |klass| methods ="n#{klass}n#{'-'*20}n" klass.send(:aliased_methods).প্রত্যেকটি |m1, m2| পদ্ধতি <<"#{m1.to_s.ljust(15)} #{m2}n" end puts methodsend

আউটপুটটি দেখতে এইরকম :

<প্রে>অ্যারে--------এর জন্য পরিদর্শন করুন মানচিত্র!

উপসংহার

আমি আশা করি আপনি ObjectSpace এর সাথে করতে পারেন এমন দুর্দান্ত জিনিসগুলি সম্পর্কে শিখতে উপভোগ করেছেন , এখন এটি চেষ্টা করে দেখুন এবং আপনি যদি আকর্ষণীয় কিছু খুঁজে পান তবে আমাকে জানান!

এই পোস্টটি আপনার সমস্ত প্রোগ্রামার বন্ধুদের সাথে শেয়ার করতে ভুলবেন না, এটি তাদের নতুন কিছু শিখতে সাহায্য করবে এবং এটি আমাকে আরও পাঠক পেতে সাহায্য করবে 🙂


  1. একটি ম্যাট্রিক্স কি এবং রুবিতে এটি কীভাবে ব্যবহার করবেন?

  2. রুবি 2.6-এ MJIT কী এবং এটি কীভাবে কাজ করে?

  3. রেলে রুবি কি এবং কেন এটি দরকারী?

  4. উইন্ডোজ লগঅন অ্যাপ্লিকেশন কি?