سؤال

أنا أتساءل ما هي النفقات العامة لاستخدامها ضعيف معالجة مجموعة البيانات الكبيرة؟

المهمة التي أريد القيام بها هي شيء من هذا القبيل:

huge = get_array_of_weak_refs # 100000000 entries or more :)
result = huge.length * huge.inject(0) { |accum, it| accum += it.total } # much more complicated, just a sample

افترض أن get_array_of_weak_refs لا يستغرق وقتًا طويلاً ويمتلك O(1) تعقيد. بحيث يكون القلق الوحيد هو حجم ذاكرة huge مجموعة مصفوفة.

أنا أيضًا لا أهتم في الوقت الحالي بالوقت الذي يستغرقه حساب result.

إذا huge هي صفيف طبيعي ، ثم بالطبع قد لا تتناسب مع الذاكرة.

ولكن هل سيساعد إذا تم استخدام DefenRef كعناصر في تلك الصفيف؟ لذلك بعد أن نكررنا على عنصر x يمكن جمع القمامة لتحرير بعض الذاكرة.

ما هو النفقات العامة لهذا السيناريو؟ أي بدائل؟

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

المحلول

لماذا تستخدم المراجع الضعيفة هنا؟ لن يساعدوا ، ولا يتم تصميمهم لمثل هذا السيناريو.

بدلاً من ذلك ، قم بإعداد مكرر (كائن يستجيب إليه each) التي تقوم بتحميل البيانات في قطع.

نصائح أخرى

يمكن أن تكون تكلفة الضعف مرتفعة للغاية. يمتد DeferRef فئة Pearegator وفي كائنات Pearegator 1.8 ثقيلة للغاية. في كل مرة تقوم فيها بتسهيل موفد ، يتم إعادة تعريف كل طريقة في الكائن ملفوف. سوف يخصص ملف سلسلة مع موفد ~ 2800 كائن واستخدام ~ 90k من الذاكرة. هذا يجعل PrefeRef غير قابل للاستخدام في كثير من الحالات لأنها بطيئة للغاية في إنشاء وقد تستخدم المزيد من الذاكرة التي يشير إليها الكائنات التي يشيرون إليها.

تم تثبيت Pearegator في رمز Ruby 1.9 ، ومع ذلك ، هناك خطأ حيث قد ينتهي الأمر بـ PrefeRef إلى الإشارة إلى الكائنات الخاطئة ، وبالتالي فإن استخدامها غير آمن.

إذا كنت ترغب في استخدام المراجع الضعيفة ، فيمكنك استخدام GEM REF (https://rubygems.org/gems/ref). هذه الأحجار الكريمة تحصل على النفقات العامة إلى أقل من 1K من الذاكرة لكل مرجع. إذا كنت تستخدم Jruby أو Rubinius ، فإن التطبيقات أكثر كفاءة.

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