विंडोज 8.1 में, क्या यह सुनिश्चित करने का एक तरीका है कि रैम से बाहर निकलते समय एक प्रक्रिया को मार दिया जाए?


18

मैंने एक .NET 4.5 एप्लिकेशन को लिखा है कि एक Kinect v2 से बफ़र्स का रंग, अवरक्त और गहराई डेटा, उस पर कुछ प्रसंस्करण करता है, और फिर इसे डिस्क से असम्पीडित रूप में डंप करता है; .NET अनुप्रयोग भी सबप्रोसेस के रूप में ffmpeg को शुरू करता है और H.264 के रूप में इनकोड करने के लिए कलर डेटा को पाइप करता है।

क्योंकि मैं एक SSD का उपयोग नहीं कर रहा हूं, वीडियो डेटा डिस्क में लिखने की तुलना में जल्दी आता है। लेकिन यह ठीक है, मेरे लिए यह स्वीकार्य है कि जब मैं RAM पर कम होता हूं तो वीडियो फ्रेम को छोड़ देता हूं। मेरी केवल आवश्यकता यह है कि जो कुछ भी मैं रखता हूं वह ज्यादातर 8-10 से 10 सेकंड के वीडियो के लिए सन्निहित हो। इसलिए मैंने अपने .NET 4.5 एप्लिकेशन में कुछ तर्क जोड़े हैं जब वीडियो फ्रेम को छोड़ना शुरू करना हो तो मेरे पास 8 से 10 सेकंड के वीडियो (लगभग 1.5 से 2 जीबी) के बफर के लिए पर्याप्त रैम नहीं है।

और, पेज थ्रैशिंग को रोकने के लिए, मैंने पूरी तरह से पेजिंग फ़ाइलों को अक्षम कर दिया है। यह मुझे कुल 16 जीबी फिजिकल रैम के साथ छोड़ता है।

मेरी समस्या यह है कि उस तंत्र के साथ भी, कभी-कभी मेरे .NET अनुप्रयोग या ffmpeg उपप्रोसेस तब भी मारे जाते हैं जब Windows 8.1 कम RAM के बारे में पता लगाता है, क्योंकि जाहिर है कि मेरा अनुप्रयोग सबसे अधिक RAM का उपयोग कर रहा है जब उसके पास वीडियो डेटा का एक विशाल बैकलॉग है। डिस्क पर लिखने के लिए। क्या विंडोज को यह बताने का एक तरीका है कि मेरी प्रक्रियाएं दूसरों की तुलना में अधिक महत्वपूर्ण हैं ताकि विंडोज पहले अन्य कम महत्वपूर्ण प्रक्रियाओं को मारना शुरू कर दे?


10
मुझे नहीं लगता कि विंडोज़ ने प्रक्रियाओं को मार दिया, मुझे लगा कि यह केवल एक सुविधा थी।
स्कॉट चेम्बरलेन

4
@ScottChamberlain: ऐसा इसलिए है क्योंकि विंडोज़ पर पेजिंग फ़ाइल को बंद करना बहुत दुर्लभ है। यह आपको हर तरह के अप्रत्याशित और असामान्य व्यवहार से रूबरू कराता है। यहाँ स्पष्ट उत्तर है "पेजिंग फ़ाइल को बंद न करें; यह विंडोज़ को रैम में अप्रयुक्त डेटा रखने के लिए मजबूर करता है ताकि आपका ऐप उस रैम का उपयोग न कर सके"
MSalters

1
यदि यह एक StackOverflow प्रश्न था, तो मैं आपको बता सकता हूं CreateMemoryResourceNotificationकि यह बहुत कम हैकी है।
13

7
@ काल: यदि डिस्क एक्सेस एक अड़चन है, तो एक मजबूत संपीड़न का उपयोग करें, यदि सीपीयू एक अड़चन है, तो एक तेज संपीड़न का उपयोग करें। यदि दोनों एक अड़चन हैं, तो अपने पूरे डिजाइन को फिर से पढ़ें और बेहतर शुरुआत करें, या बेहतर हार्डवेयर प्राप्त करें।
मूविंग डक

1
@FactorMystic OMG उन्होंने क्या किया? पेज फ़ाइल को अक्षम करने से आपकी उपयोग करने योग्य रैम में काफी कमी आने वाली है।
एरन

जवाबों:


45

जब रैम का उपयोग किया जाता है तो विंडोज प्रक्रियाओं को नहीं मारता है। वास्तव में क्या होता है कि प्रक्रियाएं स्मृति और क्रैश को आवंटित करने में विफल होती हैं।

ऐसा इसलिए हो रहा है क्योंकि आपकी सभी भौतिक मेमोरी उपयोग में है और क्योंकि पेजफाइल अक्षम है, मेमोरी मैनेजर के पास अब उन पृष्ठों को लिखने की क्षमता नहीं है जिनका उपयोग नहीं किया जा रहा है। यह आपकी भौतिक रैम को पूर्ण रखता है और जब आपकी प्रक्रिया, या समय पर चलने वाली कोई भी चीज, एक पृष्ठ आवंटित करने का प्रयास करती है, तो वह विफल हो जाती है। कुछ एप्लिकेशन क्रैश।

टेक्नेट की यह प्रस्तुति बताती है: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

जब आप ओवर प्रतिबद्धता के लिए बैकस्टॉप के रूप में कार्य करके अपनी सभी मेमोरी का उपयोग करते हैं, तो पेजफाइल अनुप्रयोगों को दुर्घटनाग्रस्त होने से बचाए रखता है।

वर्चुअल मेमोरी बहुत हद तक इस बात की नींव है कि आधुनिक ऑपरेटिंग सिस्टम संसाधनों को कैसे आवंटित करते हैं, इसलिए यह रैम में उन सभी चीजों के बारे में है जो उपयोग में हैं, और डिस्क से सामान को अंदर और बाहर ले जा रहे हैं।

वास्तव में केवल दो उत्तर हैं:

  1. पेजफाइल को पुनः सक्षम करें और डिस्क थ्रैशिंग को कम करने के लिए अपने कंप्यूटर पर रैम बढ़ाएं।
  2. अपने एप्लिकेशन की मेमोरी आवश्यकताओं को कम करें।

लब्बोलुआब यह है कि RAM केवल कैश का एक और स्तर है, और सभी सामानों के बारे में वर्चुअल मेमोरी, पेजफाइल्स, मेमोरी मैप्ड फाइलें, और यह सब मूल रूप से नीचे आता है: यदि आप मेमोरी से बाहर चल रहे हैं, तो आपको जोड़ना होगा अधिक।


4
या कम उपयोग करें ....
nhgrif

1
कृपया ध्यान दें कि बैकलॉग का निर्माण हो रहा है क्योंकि डेटा को डिस्क पर पर्याप्त तेजी से नहीं लिखा जा सकता है। मुझे नहीं लगता कि बहुत ही डिस्क पर वर्चुअल मेमोरी को सक्षम करने से वहां मदद मिल सकती है ...
अलेक्जेंडर

3
वास्तव में, पेज फ़ाइल डिस्क पर कहीं और होगी। और जब से हम जानते हैं कि यह एक एसएसडी नहीं है, तो इसका मतलब है कि एक भौतिक तलाश जो सबसे धीमी डिस्क ऑपरेशन है।
MSalters 13:18

9
लगता है कि आपने तो अपने आवेदन में स्पष्ट स्मृति प्रबंधन की आवश्यकता है ...
जो

1
@ ठीक है यह। कचरा संग्रहकर्ता इस प्रकार की स्थितियों में स्मृति प्रबंधन को एक बुरा सपना बनाने जा रहा है। इस प्रकार की स्थिति मेरे लिए C ++ से निपटने के लिए तुच्छ है क्योंकि मेरे पास सभी मेमोरी उपयोग का ठीक-ठीक नियंत्रण है। हालांकि ऐसे डिज़ाइन पैटर्न हैं जो C # में इस मामले के लिए ठीक काम करेंगे, साथ ही, यह उतना सरल नहीं है जितना कि अधिकांश लोग इसके लिए प्रयास करेंगे।
thebluefish

0

यदि आप पहले से ही नहीं है, तो विंडो टूल पैनल और उन्नत सेटिंग्स पर जाएं और अनावश्यक प्रभाव को अक्षम करें, जैसे कि विंडो प्रभाव।

इससे भी महत्वपूर्ण बात, अपने प्रोग्राम को निष्पादित करने और देखने के लिए प्रोसेस एक्सप्लोरर और / या सिस्टम मॉनिटर का उपयोग करें और देखें कि यह कहां और कैसे विफल रहता है। कौन सा धागा स्मृति से कम चलता है और पहले मर जाता है - मुख्य prgm या ffmpeg हिस्सा? क्या कोई विशिष्ट dll या अन्य साझा संसाधन हैं जो आकार में अप्रत्याशित रूप से गुब्बारे हैं? या निष्पादन सही ढंग से आगे बढ़ रहा है, डेटा में चबाने की तुलना में अधिक काटने के अलावा?

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

अंतिम सुझाव: शायद लिनक्स पर स्विच करने पर विचार करें, और इस बीच, पेजिंग फ़ाइल को फिर से सक्षम करें (लिनक्स इसे स्वैप स्पेस कहते हैं, जो स्वैप-मीट या कुछ और की तरह आईएमओ को अधिक मजेदार बनाता है!) शुभकामनाएँ!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.