Ruby Academy · पाठ

Memory Optimization

Allocations घटाएँ

पाठ 3, कुल 4 में से13 चरण

Memory Optimization, CoddyKit पर Ruby Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Ruby Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Ruby Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

मेमोरी क्यों महत्वपूर्ण है

Ruby द्वारा बनाया गया हर ऑब्जेक्ट मेमोरी लेता है और कचरा संग्रहण का काम बढ़ाता है। कम आवंटन का अर्थ है तेज़ और अधिक दक्ष प्रोग्राम।

  • GC ऑब्जेक्ट वापस लेने के लिए रुकता है
  • आवंटन की अधिक दर GC को अधिक बार चलाती है
  • आवंटन कम करना अक्सर सबसे बड़ा सुधार देता है
before = GC.stat(:total_allocated_objects)
100.times { 'new string' + '!' }
after = GC.stat(:total_allocated_objects)
puts "Allocated: #{after - before} objects"

आवंटनों की गिनती करना

GC.stat ऐसे आवंटन काउंटर उपलब्ध कराता है जिनकी तुलना किसी ब्लॉक के पहले और बाद में की जा सकती है।

  • :total_allocated_objects लगातार बढ़ता रहता है
  • किसी हिस्से को मापने के लिए पहले और बाद के मानों का अंतर निकालिए
def allocations
  before = GC.stat(:total_allocated_objects)
  yield
  GC.stat(:total_allocated_objects) - before
end

puts allocations { Array.new(1000) { |i| i.to_s } }

फ़्रीज़ किए गए स्ट्रिंग लिटरल

बार-बार लिखे गए स्ट्रिंग लिटरल हर बार नया ऑब्जेक्ट आवंटित करते हैं। उन्हें फ़्रीज़ करना Ruby को एक ही अपरिवर्तनीय इंस्टेंस फिर से इस्तेमाल करने देता है।

  • फ़ाइल के सबसे ऊपर विशेष टिप्पणी जोड़ें
  • या अलग-अलग लिटरल पर .freeze लागू करें
# frozen_string_literal: true

s1 = 'hello'
s2 = 'hello'
puts s1.equal?(s2)

लूप में आवंटन से बचना

तेज़ी से दोहराए जाने वाले लूप के भीतर ऑब्जेक्ट बनाना आवंटनों की संख्या कई गुना बढ़ा देता है। स्थिरांकों को लूप के बाहर रखें।

  • रेगुलर एक्सप्रेशन, ऐरे और स्ट्रिंग एक ही बार बनाएँ
  • हर पुनरावृत्ति में उनका फिर से उपयोग करें
PATTERN = /\d+/

def count_numbers(lines)
  lines.count { |line| line.match?(PATTERN) }
end

puts count_numbers(['a1', 'bb', 'c3'])

बदलाव करने वाली विधियाँ (बैंग)

बिना-बैंग वाली विधियाँ नए ऑब्जेक्ट लौटाती हैं; बैंग विधियाँ उसी जगह मूल ऑब्जेक्ट में बदलाव करती हैं, जिससे आवंटन बचते हैं।

  • map!, gsub!, sort!
  • इनका उपयोग तभी करें जब मूल ऑब्जेक्ट में बदलाव करना सुरक्षित हो
arr = [3, 1, 2]
arr.sort!
puts arr.inspect

s = 'hello world'
s.upcase!
puts s

कुंजियों के रूप में सिंबल बनाम स्ट्रिंग

सिंबल इंटरन किए जाते हैं: एक ही सिंबल एक साझा ऑब्जेक्ट होता है। हैश की कुंजियों के लिए इनका उपयोग करें।

  • स्ट्रिंग कुंजियाँ हर बार नई स्ट्रिंग आवंटित करती हैं
  • बार-बार की जाने वाली खोजों में सिंबल मेमोरी बचाते हैं
puts :name.equal?(:name)
puts 'name'.equal?('name')

लेज़ी एन्यूमरेटर

map और select को श्रृंखला में जोड़ने पर बीच के ऐरे बनते हैं। lazy तत्वों को एक-एक करके संसाधित करता है।

  • बीच के संग्रहों के लिए कोई आवंटन नहीं होता
  • बड़े या अनंत अनुक्रमों के लिए बहुत उपयोगी
result = (1..Float::INFINITY).lazy
  .select { |n| n.even? }
  .map { |n| n * n }
  .first(5)
puts result.inspect

लोड करने के बजाय क्रमशः पढ़ना

पूरी फ़ाइल को मेमोरी में पढ़ना व्यर्थ है। इसके बजाय उसे क्रमशः एक-एक पंक्ति पढ़ें।

  • each_line एक बार में एक पंक्ति संसाधित करता है
  • फ़ाइल के आकार से स्वतंत्र, मेमोरी स्थिर रहती है
text = "line1\nline2\nline3"
text.each_line do |line|
  puts line.strip.upcase
end

स्ट्रिंग संयोजन

लूप में + से स्ट्रिंग बनाने पर हर बार नई स्ट्रिंग आवंटित होती है। उसी जगह जोड़ने के लिए << का उपयोग करें।

  • + एक नया ऑब्जेक्ट बनाता है
  • << मौजूदा बफ़र में बदलाव करता है
buffer = String.new
5.times { |i| buffer << "item#{i} " }
puts buffer

ऑब्जेक्ट पूलिंग और पुनः उपयोग

महँगे ऑब्जेक्ट फिर से बनाने के बजाय उनका पुनः उपयोग करें।

  • पार्स किए गए config या संकलित रेगुलर एक्सप्रेशन को कैश करें
  • किसी स्थिरांक या मेमोआइज़ किए हुए मान का उपयोग करें
def config
  @config ||= { host: 'localhost', port: 4567 }
end

puts config.equal?(config)

जानकारी के लिए GC चलाना

सुधारों की पुष्टि करने के लिए आप GC के व्यवहार की जाँच कर सकते हैं।

  • GC.stat(:count) बताता है कि GC कितनी बार चला
  • अनुकूलन के बाद कम बार चलना एक अच्छा संकेत है
start = GC.stat(:count)
50_000.times { |i| [i] }
puts "GC runs: #{GC.stat(:count) - start}"

त्वरित जाँच

मेमोरी के अनुकूलन से जुड़ी अपनी समझ का परीक्षण करें।

सारांश

आपने मेमोरी का अनुकूलन करना सीखा:

  • GC.stat से आवंटनों की गिनती करें
  • स्ट्रिंग लिटरल को फ़्रीज़ करें और ऑब्जेक्ट का पुनः उपयोग करें
  • नए ऑब्जेक्ट बनाने से बचने के लिए बैंग विधियों और << को प्राथमिकता दें
  • कुंजियों के लिए सिंबल और डेटा-प्रवाह के लिए लेज़ी एन्यूमरेटर का उपयोग करें
  • बड़े डेटा को पूरी तरह लोड करने के बजाय क्रमशः पढ़ें

अब आप सामान्य प्रदर्शन-अड़चनों से निपटेंगे।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Ruby सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
29
पाठ
109

अक्सर पूछे जाने वाले प्रश्न

क्या “Memory Optimization” पाठ निःशुल्क है?

हाँ — Ruby Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “Memory Optimization” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Ruby Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Memory Optimization” में मैं क्या सीखूँगा?

Allocations घटाएँ आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Ruby Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Ruby Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Ruby Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“Memory Optimization” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Ruby Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Ruby Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Performance मापना
  2. Profiling Tools
  3. Memory Optimization
  4. सामान्य Bottlenecks
← Ruby Academy पर वापस जाएँ