मेमोरी ऑप्टिमाइज़ करें

किसी समस्या की शिकायत करें सोर्स देखें रात · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

इस पेज पर, Basel की इस्तेमाल की जाने वाली मेमोरी को सीमित और कम करने का तरीका बताया गया है.

सीमित रैम के साथ रनिंग बेज़ल

कुछ स्थितियों में, हो सकता है कि आप Basel को कम मेमोरी का इस्तेमाल करने देना चाहें. आप स्टार्टअप फ़्लैग के ज़रिए ज़्यादा से ज़्यादा हीप --host_jvm_args --host_jvm_args=-Xmx2g जैसे.

मेमोरी के लिए, इंक्रीमेंटल बिल्ड स्पीड इस्तेमाल करें

अगर आपके बिल्ड बहुत बड़े हैं, तो Basel को OutOfMemoryError (OOM) में फेंकना चाहिए इसमें पर्याप्त मेमोरी नहीं है. बेज़ल मेमोरी का इस्तेमाल कम पैसों में किया जा सकता है नीचे दिए गए कमांड फ़्लैग पास करके, धीमे इंक्रीमेंटल बिल्ड का इस्तेमाल करें: --discard_analysis_cache --nokeep_state_after_build और --notrack_incremental_state.

ये फ़्लैग उस मेमोरी को कम कर देंगे जिसका इस्तेमाल Ba बैंक ने बिल्ड में किया है, लेकिन इसके लिए इतनी ज़्यादा रकम खर्च करनी होगी अगर फ़्यूचर बिल्ड को स्टैंडर्ड इंक्रीमेंटल बिल्ड के मुकाबले धीमा बनाया जाता है.

इनमें से किसी एक फ़्लैग को अलग से भी पास किया जा सकता है:

  • --discard_analysis_cache, एक्ज़ीक्यूशन के दौरान इस्तेमाल की गई मेमोरी को कम कर देगा (नहीं विश्लेषण). इंक्रीमेंटल बिल्ड को पैकेज लोडिंग फिर से करने की ज़रूरत नहीं होगी, लेकिन के लिए फिर से विश्लेषण और निष्पादन करना होगा (हालांकि ऑन-डिस्क कार्रवाई कैश दोबारा लागू होने से रोकें).
  • --notrack_incremental_state, Basel के इंटरनल वर्शन में किसी भी किनारे को सेव नहीं करेगा डिपेंडेंसी ग्राफ़, ताकि इंक्रीमेंटल बिल्ड के लिए इसका इस्तेमाल न किया जा सके. अगला बिल्ड उस डेटा को खारिज कर देगा, लेकिन उस तारीख तक उसे अंदरूनी डीबगिंग के लिए सुरक्षित रखा जाता है, जब तक --nokeep_state_after_build बताया न गया हो.
  • --nokeep_state_after_build बिल्ड के बाद सारा डेटा खारिज कर देगा, ताकि इंक्रीमेंटल बिल्ड शुरुआत से बनाने चाहिए (डिस्क पर होने वाली कार्रवाई को छोड़कर) कैश मेमोरी में सेव किया जाता है). सिर्फ़ इस वजह से, मौजूदा बिल्ड के हाई-वॉटर मार्क पर कोई असर नहीं पड़ता.

स्काईफ़ोकस (प्रयोग के तौर पर उपलब्ध) के साथ, मेमोरी की क्षमता बढ़ाने के लिए ट्रेड करना

अगर आपको Basel को कम मेमोरी का इस्तेमाल करना है और बिल्ड की स्पीड को बनाए रखना है, तो आप Baze को उन फ़ाइलों के सही सेट के बारे में बता सकते हैं जिनमें आप बदलाव करने वाले हैं, और Baज़ल, सिर्फ़ उस स्थिति को बनाए रखेगा जो ज़रूरत के हिसाब से, समय-समय पर किए जाने वाले बदलावों को उन फ़ाइलों को कॉपी किया जा सकता है. इस सुविधा को स्काईफ़ोकस कहा जाता है.

स्काईफ़ोकस का इस्तेमाल करने के लिए, --experimental_enable_skyfocus फ़्लैग को पास करें:

bazel build //pkg:target --experimental_enable_skyfocus

डिफ़ॉल्ट रूप से, काम करने वाला सेट, टारगेट के बगल में मौजूद फ़ाइलों का सेट होगा बनाया. उदाहरण में, //pkg की सभी फ़ाइलें काम करने वाले सेट में रखी जाएंगी, और काम करने वाले सेट के बाहर की फ़ाइलों में किए गए बदलावों की अनुमति तब तक नहीं दी जाएगी, जब तक आप समस्या को हल न कर दें bazel clean या Basel सर्वर को रीस्टार्ट करें.

अगर फ़ाइलों या डायरेक्ट्री का सटीक सेट तय करना है, तो --experimental_working_set फ़्लैग करता है, जैसे:

bazel build //pkg:target --experimental_enable_skyfocus
--experimental_working_set=path/to/another/dir,path/to/tests/dir

आप यह दिखाने के लिए --experimental_skyfocus_dump_post_gc_stats को भी पास कर सकते हैं: मेमोरी में कमी:

इसे पूरी तरह से सेट करने पर, आपको कुछ ऐसा दिखेगा:

$ bazel test //pkg:target //tests/... --experimental_enable_skyfocus --experimental_working_set dir1,dir2,dir3/subdir --experimental_skyfocus_dump_post_gc_stats
INFO: --experimental_enable_skyfocus is enabled. Blaze will reclaim memory not needed to build the working set. Run 'blaze dump --skyframe=working_set' to show the working set, after this command.
WARNING: Changes outside of the working set will cause a build error.
INFO: Analyzed 149 targets (4533 packages loaded, 169438 targets configured).
INFO: Found 25 targets and 124 test targets...
INFO: Updated working set successfully.
INFO: Focusing on 334 roots, 3 leafs... (use --experimental_skyfocus_dump_keys to show them)
INFO: Heap: 1237MB -> 676MB (-45.31%)
INFO: Elapsed time: 192.670s ...
INFO: Build completed successfully, 62303 total actions

उदाहरण के लिए, स्काईफ़ोकस का इस्तेमाल करने से Baज़ेन की मेमोरी 561 एमबी (45%) कम हो गई. और dir1, dir2, और dir3/subdir अपनी तेज़ स्पीड पर काम करते रहेंगे. हालांकि, इसके बदले में बेज़ल ये काम नहीं कर पाएंगे इन डायरेक्ट्री के बाहर बदली गई फ़ाइलों को फिर से बनाएं.

मेमोरी प्रोफ़ाइलिंग

Basel के सिस्टम में पहले से ही एक मेमोरी प्रोफ़ाइलर होता है. इससे आपको यह तय करने में मदद मिलती है कि मेमोरी का इस्तेमाल. इस प्रोसेस के बारे में यहां ज़्यादा पढ़ें मेमोरी प्रोफ़ाइलिंग सेक्शन दस्तावेज़ में कस्टम नियमों की परफ़ॉर्मेंस को बेहतर बनाने का तरीका बताया गया है.