মেমোরিচেস কনফিগারেশনে মেমরির সীমা মেনে চলে না


87

আমি একটি অ্যাপ্লিকেশনে .NET 4.0 মেমোরি ক্যাশে ক্লাসের সাথে কাজ করছি এবং সর্বোচ্চ ক্যাশের আকার সীমাবদ্ধ করার চেষ্টা করছি, তবে আমার পরীক্ষায় এটি প্রদর্শিত হয় না যে ক্যাশে আসলে সীমাবদ্ধতা মেনে চলেছে।

আমি সেটিংস ব্যবহার করছি যা এমএসডিএন অনুসারে ক্যাশের আকার সীমাবদ্ধ করার কথা বলেছে :

  1. ক্যাশেমেমিরিলিমেটমেগাবাইটস : মেগাবাইটে সর্বাধিক মেমরির আকার, যে কোনও বস্তুর উদাহরণ বাড়তে পারে ""
  2. PhysicalMemoryLimitPercentage : "প্রকৃত মেমরি যা ক্যাশে ব্যবহার করতে পারেন শতাংশ 1 থেকে 100 একটি পূর্ণসংখ্যা মান হিসাবে প্রকাশ ডিফল্ট শূন্য হয়, যা নির্দেশ করে যে MemoryCache দৃষ্টান্ত তাদের নিজস্ব মেমরি পরিচালনা 1 মেমরির পরিমাণ যে ইনস্টল করা উপর ভিত্তি করে কম্পিউটার। " 1. এটি সম্পূর্ণ সঠিক নয় - 4 এর নীচের কোনও মান উপেক্ষা করা হবে এবং 4 এর সাথে প্রতিস্থাপিত হবে।

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

এইগুলি 3 জিবি র‌্যাম সহ 32-বিট উইন্ডোজ 7 পিসিতে নীচের উদাহরণ কোডটি পরীক্ষার ফলাফল। ক্যাশে আইটেম রিমোভড () এ প্রথম কল করার পরে ক্যাশের আকার নেওয়া হয়প্রতিটি পরীক্ষায় এ । (আমি সচেতন যে ক্যাশের প্রকৃত আকার এর চেয়ে বড় হবে)

MemLimitMB    MemLimitPct     AVG Cache MB on first expiry    
   1            NA              84
   2            NA              84
   3            NA              84
   6            NA              84
  NA             1              84
  NA             4              84
  NA            10              84
  10            20              81
  10            30              81
  10            39              82
  10            40              79
  10            49              146
  10            50              152
  10            60              212
  10            70              332
  10            80              429
  10           100              535
 100            39              81
 500            39              79
 900            39              83
1900            39              84
 900            41              81
 900            46              84

 900            49              1.8 GB approx. in task manager no mem errros
 200            49              156
 100            49              153
2000            60              214
   5            60              78
   6            60              76
   7           100              82
  10           100              541

পরীক্ষার আবেদন এখানে:

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Runtime.Caching;
using System.Text;
namespace FinalCacheTest
{       
    internal class Cache
    {
        private Object Statlock = new object();
        private int ItemCount;
        private long size;
        private MemoryCache MemCache;
        private CacheItemPolicy CIPOL = new CacheItemPolicy();

        public Cache(long CacheSize)
        {
            CIPOL.RemovedCallback = new CacheEntryRemovedCallback(CacheItemRemoved);
            NameValueCollection CacheSettings = new NameValueCollection(3);
            CacheSettings.Add("CacheMemoryLimitMegabytes", Convert.ToString(CacheSize)); 
            CacheSettings.Add("physicalMemoryLimitPercentage", Convert.ToString(49));  //set % here
            CacheSettings.Add("pollingInterval", Convert.ToString("00:00:10"));
            MemCache = new MemoryCache("TestCache", CacheSettings);
        }

        public void AddItem(string Name, string Value)
        {
            CacheItem CI = new CacheItem(Name, Value);
            MemCache.Add(CI, CIPOL);

            lock (Statlock)
            {
                ItemCount++;
                size = size + (Name.Length + Value.Length * 2);
            }

        }

        public void CacheItemRemoved(CacheEntryRemovedArguments Args)
        {
            Console.WriteLine("Cache contains {0} items. Size is {1} bytes", ItemCount, size);

            lock (Statlock)
            {
                ItemCount--;
                size = size - 108;
            }

            Console.ReadKey();
        }
    }
}

namespace FinalCacheTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            int MaxAdds = 5000000;
            Cache MyCache = new Cache(1); // set CacheMemoryLimitMegabytes

            for (int i = 0; i < MaxAdds; i++)
            {
                MyCache.AddItem(Guid.NewGuid().ToString(), Guid.NewGuid().ToString());
            }

            Console.WriteLine("Finished Adding Items to Cache");
        }
    }
}

মেমোরিচেস কনফিগার করা মেমরি সীমাটি মানছে না কেন ?


4
লুপটি ভুল, আমি ++ ছাড়াই
xiaoyifang

4
আমি এই বাগের জন্য একটি এমএস কানেক্ট প্রতিবেদন যুক্ত করেছি (সম্ভবত অন্য কেউ ইতিমধ্যে করেছে, তবে যাইহোক ...) সংযুক্ত.মাইক্রোসফট
ব্রুনো ব্র্যান্ট

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

4
দেখে মনে হচ্ছে তারা MemoryCache.CacheMemoryLimit এর জন্য দস্তাবেজ আপডেট হয়েছে: "। MemoryCache অবিলম্বে CacheMemoryLimit প্রতিটি সময় একটি নতুন আইটেম একটি MemoryCache উদাহরণস্বরূপ যোগ করা হয় জোরদার নেই অভ্যন্তরীণ হিউরিস্টিক যা MemoryCache থেকে অতিরিক্ত আইটেম evicts এটা ধীরে ধীরে করে ..." msdn.microsoft .কম / এন-ইউএস / লাইব্রেরি /…
সুলি

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

উত্তর:


100

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

সেটিংসটি সঠিকভাবে পঠিত হচ্ছে, তবে মনে হচ্ছে সিএলআর-এ নিজেই একটি গভীর-আসনযুক্ত সমস্যা রয়েছে যা দেখে মনে হচ্ছে এটি মেমরির সীমাটি সেটিংসটিকে মূলত অকেজো করে দেবে।

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

protected override int GetCurrentPressure()
{
  int num = GC.CollectionCount(2);
  SRef ref2 = this._sizedRef;
  if ((num != this._gen2Count) && (ref2 != null))
  {
    this._gen2Count = num;
    this._idx ^= 1;
    this._cacheSizeSampleTimes[this._idx] = DateTime.UtcNow;
    this._cacheSizeSamples[this._idx] = ref2.ApproximateSize;
    IMemoryCacheManager manager = s_memoryCacheManager;
    if (manager != null)
    {
      manager.UpdateCacheSize(this._cacheSizeSamples[this._idx], this._memoryCache);
    }
  }
  if (this._memoryLimit <= 0L)
  {
    return 0;
  }
  long num2 = this._cacheSizeSamples[this._idx];
  if (num2 > this._memoryLimit)
  {
    num2 = this._memoryLimit;
  }
  return (int) ((num2 * 100L) / this._memoryLimit);
}

প্রথম যে বিষয়টি আপনি লক্ষ্য করতে পারেন তা হ'ল এটি জেন ​​2 জঞ্জাল সংগ্রহের পরে পর্যন্ত ক্যাশের আকারের দিকে তাকানোর চেষ্টা করে না, পরিবর্তে কেবল ক্যাশেসাইজাম্পলীতে বিদ্যমান সঞ্চিত আকারের মানটি পিছনে পড়ে। সুতরাং আপনি ঠিক এখনই লক্ষ্যটিকে আঘাত করতে সক্ষম হবেন না, তবে বাকিরা যদি কাজ করে তবে প্রকৃত সমস্যায় পড়ার আগে আমরা কমপক্ষে একটি আকার পরিমাপ করব।

সুতরাং ধরে নিচ্ছি যে একটি জেন ​​2 জিসি হয়েছে, আমরা সমস্যা 2 এ চলে যাই, এটিই হল রেফ 2 App অ্যাপ্রোমিক্সেসাইজ প্রকৃতপক্ষে ক্যাশের আকারের কাছাকাছি হওয়ার একটি ভয়ঙ্কর কাজ করে। সিএলআর জাঙ্কের মাধ্যমে স্লোগিং করে আমি দেখতে পেলাম যে এটি একটি সিস্টেম.সাইজড রেফারেন্স, এবং এটি মূল্য পেতে এটিই করছে (ইন্টারপ্রেট নিজেই মেমোরি ক্যাশে অবজেক্টের হ্যান্ডেল):

[SecurityCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern long GetApproximateSizeOfSizedRef(IntPtr h);

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

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

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

এই বিশাল উত্তরটির টিএলডিআর সংস্করণ: ধরে নিন যে সময়মতো এই মুহুর্তে ক্যাশেমেমিরিলিমিটমেগাবাইটগুলি সম্পূর্ণরূপে আবদ্ধ। আপনি এটি 10 ​​এমবিতে সেট করতে পারেন এবং তারপরে ক্যাশেটি ~ 2 গিগাবাইটে পূরণ করতে এবং আইটেম অপসারণের কোনও ট্রিপ ছাড়াই মেমরির ব্যতিক্রম ছাড়তে পারেন।


4
একটি ভাল উত্তর আপনাকে ধন্যবাদ। আমি এটি দিয়ে কী চলছে তা নির্ধারণের চেষ্টা ছেড়ে দিয়েছিলাম এবং পরিবর্তে এখন ক্যাশে আকার পরিচালনা করতে / আউট আইটেমগুলি গণনা করে এবং কল করে ri ট্রিম () প্রয়োজন অনুসারে ম্যানুয়ালি। আমি ভেবেছিলাম সিস্টেম.রুনটাইম.ক্যাচিংটি আমার অ্যাপ্লিকেশনটির পক্ষে একটি সহজ পছন্দ ছিল কারণ এটি ব্যাপকভাবে ব্যবহৃত হচ্ছে বলে মনে হয় এবং আমি ভেবেছিলাম যে কোনও বড় বাগ নেই gs
কানাকোর্স

4
কি দারুন. এজন্য আমি এসওকে ভালবাসি। আমি ঠিক একই আচরণের দিকে দৌড়েছি, একটি পরীক্ষামূলক অ্যাপ লিখেছি এবং ভোটদানের সময়টি 10 ​​সেকেন্ডের চেয়ে কম এবং ক্যাশে মেমরির সীমা 1MB হ'ল যদিও আমার পিসি অনেকবার ক্র্যাশ করতে সক্ষম হয়েছিল। সমস্ত অন্তর্দৃষ্টি জন্য ধন্যবাদ।
ব্রুনো ব্রেন্ট

7
আমি জানি আমি এই প্রশ্নটিতে কেবল এটি উল্লেখ করেছি তবে সম্পূর্ণতার জন্য, আমি আবার এটি এখানে উল্লেখ করব। আমি এটির জন্য কানেক্টে একটি সমস্যা খুলেছি। কানেক্ট.মাইক্রোসফট
ব্রুনো ব্রেন্ট

4
আমি বাইরের পরিষেবাতে ডেটার জন্য MemoryCache ব্যবহার করছি, এবং যখন আমি MemoryCache মধ্যে আবর্জনা ইনজেকশনের দ্বারা পরীক্ষা, এটা করে স্বতঃ-ট্রিম বিষয়বস্তু, কিন্তু শুধুমাত্র যখন শতাংশ সীমা মান ব্যবহার করে। নিখুঁত আকার মাপসই সীমিত করতে কিছুই করে না, কমপক্ষে মেমরির প্রোফাইলারের সাথে ইনপেক্সটিং করার সময়। কিছুক্ষণ লুপে পরীক্ষা করা হয়নি, তবে আরও "বাস্তববাদী" ব্যবহারের মাধ্যমে (এটি একটি ব্যাকএন্ড সিস্টেম, তাই আমি একটি ডাব্লুসিএফ পরিষেবা যুক্ত করেছি যা আমাকে চাহিদার উপর ক্যাশে ডেটা ইনজেক্ট করতে দেয়)।
Svend

.NET কোর এ এখনও সমস্যা আছে?
Павле

29

আমি জানি এই উত্তরটি দেরিতে পাগল, তবে আগের চেয়ে বেশি দেরি। আমি আপনাকে জানাতে চেয়েছিলাম যে আমি এর একটি সংস্করণ লিখেছি MemoryCacheযা আপনার জন্য জেনার 2 সংগ্রহের সমস্যাগুলি স্বয়ংক্রিয়ভাবে সমাধান করে। ভোটগ্রহণের বিরতি যখন মেমরির চাপ নির্দেশ করে তখন এটি ছাঁটাই হয়। আপনি যদি এই সমস্যাটি অনুভব করছেন, তবে একবার দেখুন!

http://www.nuget.org/packages/SharpMemoryCache

আমি কীভাবে এটি সমাধান করেছি তা সম্পর্কে যদি আপনি আগ্রহী হন তবে আপনি এটি গিটহাবেও খুঁজে পেতে পারেন। কোডটি কিছুটা সহজ।

https://github.com/haneytron/sharpmemorycache


4
এটি ইচ্ছাকৃত হিসাবে কাজ করে, এমন কোনও জেনারেটরের সাথে পরীক্ষা করা হয় যা 1000 অক্ষরের বোঝা স্ট্রিং দিয়ে ক্যাশে পূরণ করে। যদিও, ক্যাশে 100MB এর মতো হওয়া উচিত তা ক্যাশে 200 - 300MB যুক্ত করে যা আমি বেশ অদ্ভুত বলে মনে করি found হয়তো কিছু শুনানি আমি গণনা করছি না।
কার্ল Cassar

4
.NET- এ @ কার্লক্যাসার স্ট্রিংগুলি প্রায় 2n + 20বাইটের সাথে আকারে আকারে থাকে, যেখানে nস্ট্রিংটির দৈর্ঘ্য। এটি বেশিরভাগ ইউনিকোড সমর্থনের কারণে।
হ্যানি

5

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

আমি নিম্নলিখিত কনফিগারেশনটি পেয়েছি এবং ব্যবহারগুলি বেশিরভাগ সময় প্রতি 5 সেকেন্ডে আইটেমকে মুক্ত করে

App.config:

ক্যাশেমেমিরিলিমিটমেগাবাইটগুলি নোট করুন । এটি শূন্যে সেট করা থাকলে, শুদ্ধকরণের রুটিন কোনও যুক্তিসঙ্গত সময়ে আগুন লাগবে না।

   <system.runtime.caching>
    <memoryCache>
      <namedCaches>
        <add name="Default" cacheMemoryLimitMegabytes="20" physicalMemoryLimitPercentage="0" pollingInterval="00:00:05" />
      </namedCaches>
    </memoryCache>
  </system.runtime.caching>  

ক্যাশে যুক্ত করা হচ্ছে:

MemoryCache.Default.Add(someKeyValue, objectToCache, new CacheItemPolicy { AbsoluteExpiration = DateTime.Now.AddSeconds(5), RemovedCallback = cacheItemRemoved });

ক্যাশে অপসারণের বিষয়টি নিশ্চিত করা কাজ করছে:

void cacheItemRemoved(CacheEntryRemovedArguments arguments)
{
    System.Diagnostics.Debug.WriteLine("Item removed from cache: {0} at {1}", arguments.CacheItem.Key, DateTime.Now.ToString());
}

4

আমি @ কনাকোর্স এর উদাহরণ এবং @ ওয়ানির সংশোধন করে কিছু পরীক্ষা করেছি এবং আমার মনে হয় এমন কিছু সমালোচনামূলক কল রয়েছে যা মেমরির ক্যাশে পরিষ্কার করতে বাধা দেয়।

public void CacheItemRemoved(CacheEntryRemovedArguments Args)
{
    // this WriteLine() will block the thread of
    // the MemoryCache long enough to slow it down,
    // and it will never catch up the amount of memory
    // beyond the limit
    Console.WriteLine("...");

    // ...

    // this ReadKey() will block the thread of 
    // the MemoryCache completely, till you press any key
    Console.ReadKey();
}

তবে @ মহিলার পরিবর্তন কেন মনে হচ্ছে স্মৃতিটিকে একই স্তরে রাখছে? প্রথমত, মুছে ফেলা কলব্যাক সেট করা নেই এবং এমন কোনও কনসোল আউটপুট নেই বা ইনপুটটির জন্য অপেক্ষা করছে যা মেমরি ক্যাশের থ্রেডকে ব্লক করতে পারে।

দ্বিতীয়ত ...

public void AddItem(string Name, string Value)
{
    // ...

    // this WriteLine will block the main thread long enough,
    // so that the thread of the MemoryCache can do its work more frequently
    Console.WriteLine("...");
}

একটি থ্রেড.স্লিপ (1) প্রতি 1000 ডলার অ্যাড আইটেম () এর একই প্রভাব থাকবে।

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


3

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

পরীক্ষার দৃশ্যে এটি স্পষ্টতই একটি বড় পার্থক্য তৈরি করে কারণ ক্যাশে অবিচ্ছিন্নভাবে আঘাত হানে তাই বস্তুগুলিতে কখনই জেনারেল 2 এ যাওয়ার সুযোগ হয় না I আমি মনে করি আমরা আমাদের প্রকল্পে এই ডেলটির সংশোধিত বিল্ডটি ব্যবহার করতে যাচ্ছি এবং অফিসিয়াল এমএস ব্যবহার করব .NET 4.5 বের হয়ে এলে তৈরি করুন (যা উপরে উল্লিখিত সংযুক্ত নিবন্ধ অনুসারে এতে ফিক্স থাকা উচিত)। যৌক্তিকভাবে আমি দেখতে পাচ্ছি কেন জেনার 2 চেক স্থাপন করা হয়েছে তবে বাস্তবে আমি নিশ্চিত নই যে এটির বেশি অর্থবোধ হয়েছে কিনা। যদি মেমরিটি 90% (বা এটি নির্ধারিত যাই হোক না কেন সীমাবদ্ধ) পৌঁছে যায় তবে জেন 2-এর সংগ্রহ ঘটেছে কি না তা বিবেচ্য নয়, আইটেম নির্বিশেষে উচ্ছেদ করা উচিত।

আমি আমার টেস্ট কোডটি প্রায় 15 মিনিটের জন্য একটি শারীরিক মেমরিলিমেট পারসেন্টেজে 65% তে সেট করে রেখেছি। আমি পরীক্ষার সময় মেমরির ব্যবহার 65-68% এর মধ্যে থাকতে দেখেছি এবং জিনিসগুলি সঠিকভাবে উচ্ছেদ হতে দেখেছি। আমার পরীক্ষায় আমি পোলিংয়ের অন্তর্বর্তীকরণটি 5 সেকেন্ডে সেট করেছি, শারীরিক মেমরিলিমিট পারসেন্টেজ 65 এ এবং শারীরিক মেমরিলিমিট পারসেন্টেজ 0 এ সেট করতে এটি ডিফল্ট।

উপরোক্ত পরামর্শ অনুসরণ; ক্যাশে থেকে জিনিসগুলি উচ্ছেদ করার জন্য IMemoryCacheManager এর একটি বাস্তবায়ন করা যেতে পারে। এটি উল্লিখিত জেনার 2 চেক ইস্যুতে ভুগতে পারে। যদিও, দৃশ্যের উপর নির্ভর করে, এটি প্রোডাকশন কোডে সমস্যা নাও হতে পারে এবং মানুষের পক্ষে পর্যাপ্তভাবে কাজ করতে পারে।


4
একটি আপডেট: আমি .NET ফ্রেমওয়ার্ক 4.5 ব্যবহার করছি এবং কোনওভাবেই সমস্যাটি সংশোধন করা হচ্ছে না। ক্যাশে মেশিনটি ক্রাশ করার জন্য যথেষ্ট বড় হতে পারে।
ব্রুনো ব্রেন্ট

একটি প্রশ্ন: আপনার বর্ণিত সংযোগ নিবন্ধটির কি লিঙ্ক আছে?
ব্রুনো ব্রেন্ট


3

দেখা গেল এটি কোনও বাগ নয়, আপনার যা করা দরকার তা সীমাবদ্ধতা প্রয়োগের জন্য পুলিংয়ের সময়সীমা নির্ধারণ করছে, মনে হচ্ছে আপনি যদি পুলিংটি সেট না করে রেখে দেন তবে এটি কখনই ট্রিগার হবে না I আমি কেবল এটি পরীক্ষা করেছি এবং মোড়কের দরকার নেই বা কোনও অতিরিক্ত কোড:

 private static readonly NameValueCollection Collection = new NameValueCollection
        {
            {"CacheMemoryLimitMegabytes", "20"},
           {"PollingInterval", TimeSpan.FromMilliseconds(60000).ToString()}, // this will check the limits each 60 seconds

        };

PollingIntervalক্যাশে কত দ্রুত বৃদ্ধি পাচ্ছে তার উপর ভিত্তি করে " " এর মান নির্ধারণ করুন, যদি এটি খুব দ্রুত বৃদ্ধি পায় তবে পোলিং চেকগুলির ফ্রিকোয়েন্সি বৃদ্ধি করুন অন্যথায় চেকগুলি খুব বেশি ঘন ঘন না করে ওভারহেডের কারণ না ঘটে।


1

আপনি যদি নিম্নলিখিত সংশোধিত ক্লাসটি ব্যবহার করেন এবং টাস্ক ম্যানেজারের মাধ্যমে মেমরিটি নিরীক্ষণ করেন তা আসলে ছাঁটাই হয়ে যায়:

internal class Cache
{
    private Object Statlock = new object();
    private int ItemCount;
    private long size;
    private MemoryCache MemCache;
    private CacheItemPolicy CIPOL = new CacheItemPolicy();

    public Cache(double CacheSize)
    {
        NameValueCollection CacheSettings = new NameValueCollection(3);
        CacheSettings.Add("cacheMemoryLimitMegabytes", Convert.ToString(CacheSize));
        CacheSettings.Add("pollingInterval", Convert.ToString("00:00:01"));
        MemCache = new MemoryCache("TestCache", CacheSettings);
    }

    public void AddItem(string Name, string Value)
    {
        CacheItem CI = new CacheItem(Name, Value);
        MemCache.Add(CI, CIPOL);

        Console.WriteLine(MemCache.GetCount());
    }
}

আপনি কি বলছেন যে এটি ছাঁটাই হয় না বা হয় না?
ক্যানাকোর্স

হ্যাঁ, এটি ছাঁটা হয়ে যায়। আশ্চর্যজনক, লোকেরা যে সমস্ত সমস্যার মুখোমুখি হচ্ছে তা বিবেচনা করে MemoryCache। আমি ভাবছি কেন এই নমুনাটি কাজ করে।
ড্যানিয়েল লিডস্ট্রোম

4
আমি এটি অনুসরণ করি না। আমি উদাহরণটি পুনরাবৃত্তি করার চেষ্টা করেছি, তবে ক্যাশে এখনও অনির্দিষ্টকালের জন্য বৃদ্ধি পায়।
ব্রুনো ব্রেন্ট

একটি বিভ্রান্তিকর উদাহরণ শ্রেণি: "স্ট্যাটলক", "আইটেম অ্যাকাউন্ট", "আকার" অকেজো ... নামভ্যালিউ কালেকশন (3) কেবল 2 টি আইটেম ধারণ করে? ... বাস্তবে আপনি সিজিলিমেট এবং পোল ইনটারভাল প্রোপার্টি সহ একটি ক্যাশে তৈরি করেছেন, এর চেয়ে বেশি কিছু নেই! আইটেমগুলি "উচ্ছেদ না করা" এর সমস্যাটি স্পর্শ করা যায় না ...
বার্নহার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.