كيفية العثور على مقدار الذاكرة الفعلية التي تشغلها التجزئة في بيرل؟

StackOverflow https://stackoverflow.com/questions/106555

  •  01-07-2019
  •  | 
  •  

سؤال

لدي برنامج نصي Perl حيث أحتفظ بذاكرة تخزين مؤقت بسيطة جدًا باستخدام جدول التجزئة.أرغب في مسح التجزئة بمجرد أن تشغل أكثر من n بايت، لتجنب نفاد ذاكرة Perl (32 بت) وتعطلها.

يمكنني التحقق من عدد أزواج قيمة المفاتيح:

if (scalar keys %cache > $maxSize)
 {
 %cache = ();
 }

ولكن هل من الممكن التحقق من الذاكرة الفعلية التي تشغلها التجزئة؟

هل كانت مفيدة؟

المحلول

ديفيل::الحجم هو الجواب على سؤالك.(لاحظ أن Devel::Size سيخصص مؤقتًا قدرًا كبيرًا من الذاكرة عند معالجة بنية بيانات كبيرة، لذا فهو ليس مناسبًا تمامًا لهذا الغرض.)

لكن، ذاكرة التخزين المؤقت::SizeAwareMemoryCache و التعادل::ذاكرة التخزين المؤقت قم بالفعل بتنفيذ ما تبحث عنه (مع واجهات مختلفة إلى حد ما)، ويمكن أن يوفر عليك إعادة اختراع العجلة.

حفظ هي وحدة تسهل تخزين القيمة المرجعة مؤقتًا من إحدى الوظائف.لا يطبق حدًا لذاكرة التخزين المؤقت على أساس الحجم، ولكن من الممكن استخدام Tie::Cache كواجهة خلفية لـ Memoize.

نصائح أخرى

أنت تبحث عن ديفيل::الحجم

اسم

Devel::Size - امتداد Perl للعثور على استخدام الذاكرة لمتغيرات Perl

ملخص

use Devel::Size qw(size total_size);

my $size = size("A string");
my @foo = (1, 2, 3, 4, 5);
my $other_size = size(\@foo);
my $foo = {a => [1, 2, 3],
        b => {a => [1, 3, 4]}
       };
my $total_size = total_size($foo);

يمكنك التثبيت ديفيل::الحجم لمعرفة الذاكرة التي تم التقاطها بواسطة أي بناء في بيرل.ومع ذلك، يجب أن تدرك أن الأمر سيستغرق قدرًا كبيرًا من الذاكرة المتوسطة، لذا لن أستخدمه ضد بنية بيانات كبيرة.بالتأكيد لن أفعل ذلك إذا كنت تعتقد أنك قد تكون على وشك نفاد الذاكرة.

راجع للشغل هناك عدد من الوحدات الجيدة على CPAN للقيام بالتخزين المؤقت في الذاكرة وغير ذلك.بدلاً من لفها بنفسك، أقترح استخدام واحدة منها بدلاً من ذلك.على سبيل المثال حاول التعادل::ذاكرة التخزين المؤقت::LRU للحصول على ذاكرة تخزين مؤقت في الذاكرة والتي ستصل فقط إلى عدد محدد من المفاتيح.

يمكنك استخدام ديفيل::الحجم لتحديد الذاكرة المستخدمة، ولكن لا يمكنك بشكل عام إعطاء ذاكرة الإرجاع لنظام التشغيل.يبدو أنك تحاول فقط التنظيف وإعادة الاستخدام، وهو ما يجب أن يعمل بشكل جيد.

إذا كانت ذاكرة التخزين المؤقت مخصصة لوظيفة ما، ففكر في استخدام حفظ الوحدة بدلاً من الحفاظ على ذاكرة التخزين المؤقت بنفسك.وهو يدعم انتهاء صلاحية ذاكرة التخزين المؤقت (عبر Memoize::Expire) حتى تتمكن من تحديد حجم ذاكرة التخزين المؤقت دون تدميرها بالكامل.

إذا كنت قلقًا بشأن إدارة مقدار الذاكرة التي يستخدمها Perl، فمن الأفضل أن تبحث عن طريقة بديلة.لماذا تحتاج إلى هذا القدر من ذاكرة الوصول العشوائي مرة واحدة؟هل يجب أن تستخدم نوعًا من نظام الثبات؟

الذاكرة المؤقتة

use Cache::Memory;

my $cache = Cache::Memory->new(
  namespace => 'MyNamespace',
  default_expires => '600 sec'
);

my $size  = $cache->size()
my $limit = $cache->size_limit();

كما قال الآخرون، فإن التخزين المؤقت ليس عجلة تحتاج إلى إعادة اختراعها، فهناك الكثير من حلول التخزين المؤقت البسيطة على CPAN والتي ستؤدي المهمة بشكل جيد بالنسبة لك.

ذاكرة التخزين المؤقت::SizeAwareMemoryCache يمكن إخبارك بالحجم الأقصى الذي تريد استخدامه، ثم يمكنك تركه ليهتم بذاكرة التخزين المؤقت نيابةً عنك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top