.NET অ্যাপ্লিকেশনগুলির মেমরির ব্যবহার হ্রাস হচ্ছে?


108

.NET অ্যাপ্লিকেশনগুলির মেমরির ব্যবহার হ্রাস করার জন্য কয়েকটি টিপস কী? নিম্নলিখিত সাধারণ সি # প্রোগ্রামটি বিবেচনা করুন।

class Program
{
    static void Main(string[] args)
    {
        Console.ReadLine();
    }
}

এক্স 64 এর রিলিজ মোডে সংকলিত এবং ভিজ্যুয়াল স্টুডিওর বাইরে চলমান, টাস্ক ম্যানেজার নিম্নলিখিতটি রিপোর্ট করেছেন:

Working Set:          9364k
Private Working Set:  2500k
Commit Size:         17480k

এটি কেবলমাত্র x86 এর জন্য সংকলিত হলে এটি আরও ভাল :

Working Set:          5888k
Private Working Set:  1280k
Commit Size:          7012k

আমি তখন নিম্নলিখিত প্রোগ্রামটি চেষ্টা করেছিলাম যা একই কাজ করে তবে রানটাইম সূচনা করার পরে প্রক্রিয়া আকার ট্রিম করার চেষ্টা করে:

class Program
{
    static void Main(string[] args)
    {
        minimizeMemory();
        Console.ReadLine();
    }

    private static void minimizeMemory()
    {
        GC.Collect(GC.MaxGeneration);
        GC.WaitForPendingFinalizers();
        SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,
            (UIntPtr) 0xFFFFFFFF, (UIntPtr)0xFFFFFFFF);
    }

    [DllImport("kernel32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetProcessWorkingSetSize(IntPtr process,
        UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize);
}

ভিজ্যুয়াল স্টুডিওর বাইরে x86 প্রকাশের ফলাফল :

Working Set:          2300k
Private Working Set:   964k
Commit Size:          8408k

যা কিছুটা ভাল তবে এটি এমন একটি সাধারণ প্রোগ্রামের জন্য এখনও অতিরিক্ত। সি # প্রক্রিয়াটিকে কিছুটা ঝুঁকিতে ফেলতে কি কৌশল আছে? আমি একটি প্রোগ্রাম লিখছি যা বেশিরভাগ সময় পটভূমিতে চালানোর জন্য ডিজাইন করা হয়েছে। আমি ইতিমধ্যে একটি পৃথক অ্যাপ্লিকেশন ডোমেনে যেকোনও ইউজার ইন্টারফেস স্টাফ করছি যার অর্থ ব্যবহারকারী ইন্টারফেস স্টাফটি নিরাপদে আনলোড করা যেতে পারে, তবে যখন কেবল ব্যাকগ্রাউন্ডে বসে থাকে তখন 10 এমবি গ্রহণ করা অতিরিক্ত মনে হয় seems

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


14
কেন যত্ন করবেন? ব্যক্তিগত কাজের সেটটি বেশ কম। মেমরি অপ্রয়োজনীয় হলে আধুনিক ওএসস ডিস্কে বেরিয়ে আসবে। এটি ২০০৯ Un
মেহরদাদ আফশারি

8
নেট ব্যবহার করা বন্ধ করুন এবং আপনার ছোট প্রোগ্রাম থাকতে পারে। .NET ফ্রেমওয়ার্কটি লোড করতে মেমরিতে প্রচুর বড় ডিএলএল লোড করা দরকার।
অ্যাডাম সিলস

2
মেমোরির দামগুলি তাত্পর্যপূর্ণভাবে হ্রাস পায় (হ্যাঁ, আপনি এখন 24 জিবি র‌্যামের সাথে একটি ডেল হোম কম্পিউটার সিস্টেম অর্ডার করতে পারেন)। আপনার অ্যাপ্লিকেশনটি ব্যবহার না করা অবধি> 500 এমবি অপটিমাইজেশন অপ্রয়োজনীয়।
অ্যালেক্স

28
@ লিকি কোড আমি সত্যিই ঘৃণা করি যে আধুনিক প্রোগ্রামাররা এইভাবে মনে করে, আপনার অ্যাপ্লিকেশনটির মেমরির ব্যবহার সম্পর্কে আপনার যত্ন নেওয়া উচিত। আমি বলতে পারি যে বেশিরভাগ জাভা বা সি # তে লেখা আধুনিক অ্যাপ্লিকেশনগুলির বেশিরভাগই অকার্যকর হয় যখন এটি রিসোর্স ম্যানেজমেন্টের কথা আসে এবং 2014 এর জন্য আমরা উইন 95 এবং mb৪ এমবি র্যামের মতো 1998 এ ফিরে যেতে পারছিলাম ঠিক তেমন অ্যাপ্লিকেশন চালাতে পারি ... ব্রাউজারের কেবলমাত্র 1 টি উদাহরণ এখন 2 জিবি র‌্যাম এবং সহজ আইডিই প্রায় 1 জিবি খায়। রাম সস্তা, তবে এর অর্থ এই নয় যে আপনার এটি নষ্ট করা উচিত।
পেট্র

6
@ পিটার আপনার সম্পদ পরিচালনার বিষয়ে যত্ন নেওয়া উচিত। প্রোগ্রামার সময়ও একটি সংস্থান। দয়া করে 10 এমবি থেকে 2 জিবি নষ্ট করে অতিরিক্ত জেনারেলাইজ করবেন না।
মেহরদাদ আফশারি

উত্তর:


33
  1. আপনি স্ট্যাক ওভারফ্লো প্রশ্ন চেক আউট করতে চাইতে পারেন .NET EXE এর মেমরি পদাঙ্ক
  2. এমএসডিএন ব্লগ পোস্ট ওয়ার্কিং সেট! = প্রকৃত মেমরির পদচিহ্নগুলি কার্যকরী সেটটিকে ক্ষুন্ন করা, মেমরি প্রক্রিয়াজাতকরণ এবং কীভাবে আপনার মোট ইন-র্যাম খরচ সম্পর্কে সঠিক গণনা করা যায় সে সম্পর্কে।

আমি এটি বলব না যে আপনার অ্যাপ্লিকেশনটির মেমরির পদচিহ্নগুলি উপেক্ষা করা উচিত - স্পষ্টতই, ছোট এবং আরও দক্ষ আপনার পছন্দসই হতে পারে। তবে আপনার আসল চাহিদা কী তা আপনার বিবেচনা করা উচিত।

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

তবে এখানে কিছু লোককে সম্বোধন করার জন্য যারা এই সম্পর্কে উদ্বিগ্ন হবেন না: আপনি যদি কোনও উইন্ডোজ ফর্ম অ্যাপ্লিকেশন লিখছেন যা টার্মিনাল পরিষেবাদির পরিবেশে চলবে, সম্ভবত একটি অংশীদার সার্ভারে 10, 20 বা আরও বেশি ব্যবহারকারী ব্যবহার করবে, তবে হ্যাঁ , আপনাকে অবশ্যই মেমরির ব্যবহার বিবেচনা করতে হবে। এবং আপনি সচেতন হতে হবে। এটিকে সম্বোধনের সর্বোত্তম উপায় হ'ল ভাল ডেটা স্ট্রাকচার ডিজাইনের সাথে এবং আপনি কখন এবং কী বরাদ্দ করেন সে সম্পর্কে সেরা অনুশীলনগুলি অনুসরণ করে।


45

নেট অ্যাপ্লিকেশনগুলির ক্ষেত্রে দেশীয় অ্যাপ্লিকেশনগুলির তুলনায় একটি বড় পদচিহ্ন থাকবে কারণ এটি উভয়কেই প্রক্রিয়ায় রানটাইম এবং অ্যাপ্লিকেশনটি লোড করতে হবে। আপনি যদি সত্যিই পরিপাটিত কিছু চান তবে .NET সেরা বিকল্প নাও হতে পারে।

তবে, মনে রাখবেন যে আপনি যদি অ্যাপ্লিকেশনটি বেশিরভাগ সময় ঘুমিয়ে থাকেন তবে প্রয়োজনীয় মেমরি পৃষ্ঠাগুলি স্মৃতি থেকে সরে যাবে এবং এভাবে বেশিরভাগ সময় সিস্টেমে খুব বেশি বোঝা আসবে না।

আপনি যদি পদচিহ্নটি ছোট রাখতে চান তবে আপনাকে মেমরির ব্যবহার সম্পর্কে ভাবতে হবে। এখানে কয়েকটি ধারণা দেওয়া হল:

  • অবজেক্টের সংখ্যা হ্রাস করুন এবং প্রয়োজনের তুলনায় আর কোনও পরিস্থিতি ধরে রাখবেন না তা নিশ্চিত করুন।
  • সতর্ক হোন List<T> এবং অনুরূপ প্রকারের যে দ্বিগুণ ক্ষমতা প্রয়োজন যখন তারা 50% বর্জ্য হতে পারে ।
  • আপনি স্ট্যাকের আরও মেমরি জোর করার জন্য রেফারেন্স প্রকারের তুলনায় মান ধরণের ব্যবহার বিবেচনা করতে পারেন তবে মনে রাখবেন যে ডিফল্ট স্ট্যাকের স্থানটি কেবল 1 এমবি।
  • 85000 বাইটের বেশি অবজেক্ট এড়িয়ে চলুন, কারণ তারা এলওএইচে যাবে যা কমপ্যাক্ট করা হয়নি এবং এভাবে সহজেই খণ্ডিত হয়ে যেতে পারে।

এটি সম্ভবত কোনও উপায়ে সম্পূর্ণ তালিকা নয়, তবে কেবল কয়েকটি দৃষ্টিকোণ।


আইওডাব্লু, একই ধরণের কৌশল যা নেট। নেটে স্থানীয় কোডের আকার হ্রাস করতে কাজ করে?
রবার্ট ফ্রেজার

আমি অনুমান করি যে এখানে কিছু ওভারল্যাপ রয়েছে, তবে নেটিভ কোড সহ মেমরি ব্যবহারের ক্ষেত্রে আপনার আরও পছন্দ আছে।
ব্রায়ান রাসমুসেন

17

এই ক্ষেত্রে আপনাকে একটি বিষয় বিবেচনা করতে হবে হ'ল সিএলআরের মেমরির ব্যয়। সিএলআর প্রতিটি। নেট প্রক্রিয়া জন্য লোড করা হয় এবং মেমরি বিবেচনার কারণ। এই জাতীয় একটি সহজ / ছোট প্রোগ্রামের জন্য সিএলআর ব্যয় আপনার মেমরির পদক্ষেপের উপরে চলেছে।

এই বেসলাইন প্রোগ্রামটির ব্যয়ের তুলনায় সত্যিকারের অ্যাপ্লিকেশনটি তৈরি করা এবং এর ব্যয়টি দেখতে আরও অনেক শিক্ষামূলক হতে হবে।


7

প্রতি সেফের জন্য কোনও নির্দিষ্ট পরামর্শ নেই, তবে আপনি সিএলআর প্রোফাইলার (মাইক্রোসফ্ট থেকে বিনামূল্যে ডাউনলোড) দেখুন at
একবার এটি ইনস্টল হয়ে গেলে, কীভাবে এটি করা যায় তা পৃষ্ঠাটি একবার দেখুন

কীভাবে:

আপনার অ্যাপ্লিকেশনটির মেমরি বরাদ্দ প্রোফাইল তদন্ত করতে কীভাবে আপনাকে সিএলআর প্রোফাইলার সরঞ্জামটি ব্যবহার করতে হয় তা আপনাকে কীভাবে তা দেখায়। মেমরির সমস্যার কারণ যেমন মেমরি ফাঁস এবং অতিরিক্ত বা অকার্যকর আবর্জনা সংগ্রহের মতো কোড সনাক্ত করতে আপনি সিএলআর প্রোফাইলার ব্যবহার করতে পারেন।


7

একটি "বাস্তব" অ্যাপ্লিকেশনটির মেমরির ব্যবহারটি দেখতে চাইতে পারে।

জাভা এর মতোই প্রোগ্রামের আকার নির্বিশেষে রানটাইমের জন্য কিছু ওভারহেডের নির্দিষ্ট পরিমাণ রয়েছে, তবে সেই বিন্দুটির পরে মেমরির খরচ অনেক বেশি যুক্তিসঙ্গত হবে।


4

এই সাধারণ প্রোগ্রামটির বেসরকারী কার্যনির্বাহী সেট হ্রাস করার উপায়গুলি এখনও রয়েছে:

  1. আপনার আবেদন এনজিএন এটি আপনার প্রক্রিয়া থেকে জেআইটি সংকলন ব্যয় সরিয়ে দেয়।

  2. এমপিজিও ব্যবহার করে আপনার অ্যাপ্লিকেশনটি প্রশিক্ষণ দিন মেমরির ব্যবহার হ্রাস করে এবং তারপরে এটি এনজিইএন ।


2

আপনার পদচিহ্ন হ্রাস করার জন্য অনেকগুলি উপায় রয়েছে।

একটি জিনিস যা আপনাকে সর্বদা সাথে থাকতে হবে। নেট এটি আপনার আইএল কোডের নেটিভ চিত্রটির আকার বিশাল

এবং এই কোডটি অ্যাপ্লিকেশন উদাহরণগুলির মধ্যে সম্পূর্ণরূপে ভাগ করা যায় না। এমনকি এনজিএন'র সম্মেলনগুলিও সম্পূর্ণ স্থিতিশীল নয়, তাদের এখনও কিছু ছোট অংশ রয়েছে যা জেআইটিটিংয়ের প্রয়োজন।

লোকেরা এমন কোডও লেখার প্রবণতা রয়েছে যা প্রয়োজনের তুলনায় মেমরিটিকে দীর্ঘায়িত করে।

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

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

সি # এর একটি দুর্দান্ত বৈশিষ্ট্য রয়েছে যা পুনরুক্তি বলে। তারা আপনাকে আপনার ইনপুট দিয়ে স্ক্রোল করে অবজেক্টগুলিকে স্ট্রিম করার অনুমতি দেয় এবং আপনি পরবর্তীটি না পাওয়া পর্যন্ত কেবল বর্তমান উদাহরণটি রাখবেন। এমনকি লিনকিউ ব্যবহার করেও, আপনাকে এখনও এগুলি সমস্ত কিছু রাখার দরকার নেই কারণ আপনি এটি ফিল্টার করতে চেয়েছিলেন।


1

শিরোনামে সাধারণ প্রশ্নে সম্বোধন করা, নির্দিষ্ট প্রশ্নটি নয়:

আপনি যদি এমন কোনও সিওএম উপাদান ব্যবহার করছেন যা প্রচুর ডেটা ফেরত দেয় (ডাবলসের বৃহত 2xN অ্যারে বলুন) এবং কেবলমাত্র একটি ছোট ভগ্নাংশের প্রয়োজন হয় তবে কোনও একটি র‌্যাপার সিওএম উপাদান লিখতে পারে যা .NET থেকে মেমরিটি আড়াল করে এবং কেবলমাত্র ডেটা ফিরিয়ে দেয় প্রয়োজন ছিল।

এটিই আমি আমার মূল অ্যাপ্লিকেশনটিতে করেছি এবং এটি মেমরির ব্যবহারের উল্লেখযোগ্য উন্নতি করেছে।


0

আমি খুঁজে পেয়েছি যে দীর্ঘ সময়ের চলমান প্রক্রিয়াটিতে মেমরি পৃষ্ঠাগুলি নিয়মিতভাবে ডিস্কে বাধ্য করার জন্য সেটপ্রসেস ওয়ার্কিংসেটসাইজ বা এমপি ওয়ার্কিংসেট API গুলি ব্যবহার করার ফলে মেশিনটি পুনরায় চালু না হওয়া পর্যন্ত মেশিনের সমস্ত উপলব্ধ শারীরিক স্মৃতি কার্যকরভাবে অদৃশ্য হয়ে যেতে পারে। আমাদের একটি নেট ডিএলএল একটি নেটিভ প্রক্রিয়াতে লোড হয়েছিল যা মেমরি নিবিড় কাজ সম্পাদন করার পরে কাজের সেটটি হ্রাস করার জন্য EmptyWorkingSet API (সেটপ্রসেস ওয়ার্কিংসেটসাইজ ব্যবহারের বিকল্প) ব্যবহার করবে। আমি দেখতে পেয়েছি যে সপ্তাহে 1 দিন থেকে এক সপ্তাহের মধ্যে কোনও মেশিন টাস্ক ম্যানেজারে 99% শারীরিক মেমরির ব্যবহার দেখাবে যখন কোনও প্রক্রিয়া কোনও উল্লেখযোগ্য মেমরির ব্যবহার করে দেখানো হয়নি। খুব শীঘ্রই মেশিনটি প্রতিক্রিয়াহীন হয়ে উঠবে, একটি হার্ড রিবুট দরকার। বলেছে মেশিনগুলি দৈনিক এবং ভার্চুয়াল হার্ডওয়্যার উভয়ই চলমান 2 ডজন উইন্ডোজ সার্ভার 2008 আর 2 এবং 2012 আর 2 সার্ভার ছিল।

সম্ভবত কোনও নেট প্রক্রিয়াতে লোড হওয়া নেট কোডটি এর সাথে কিছু করার ছিল তবে আপনার নিজের ঝুঁকিতে এমপি ওয়ার্কিংসেট (বা সেটপ্রসেস ওয়ার্কিংসেটসাইজ) ব্যবহার করুন। আপনার অ্যাপ্লিকেশন প্রারম্ভিক শুরুর পরে সম্ভবত এটি একবার ব্যবহার করুন। আমি কোডটি অক্ষম করার সিদ্ধান্ত নিয়েছি এবং আবর্জনা সংগ্রাহককে নিজে থেকে মেমরির ব্যবহার পরিচালনা করতে দিন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.