كيفية استخدام الذاكرة الافتراضية (المبادلة في نظام ملفات لينكس) في برمجة الويب جافا

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

سؤال

أنا أعمل في تطبيق ويب جافا.في بعض الأقسام أستخدم متغير شجرة ضخم جدًا يحفظ ويستمر في الذاكرة (RAM).هل يمكنني ترحيل هذا إلى الذاكرة الافتراضية (المبادلة).ملحوظة :تتكون الشجرة الضخمة من الاسم والبريد الإلكتروني لجميع المستخدمين الذين يستخدمون مربع النص الخاص باقتراح Ajax.

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

المحلول

لا توجد طريقة قياسية في Linux لإجبار كتلة من الذاكرة إلى المبادلة، وبالتالي لن يكون لدى JVM وسيلة لسؤال نظام التشغيل أداء هذه المهمة.

أفضل ما يمكنك القيام به إذا كنت تريد هذه الوظيفة، هو تسلسل الشجرة واكتب البيانات الأولية إلى ملف القرص ثم أعاده عندما تكون جاهزا لذلك.

ولكن ربما لا تريد هذا، لأن الكتابة إلى القرص هو الى ابعد حد بطيئة عند مقارنتها بالذاكرة الفعلية I / O.

الحالة في النقطة، دع نظام التشغيل تقلق بشأن هذا. من الآمن افتراض أنه يعرف طريقة أفضل لإدارة الذاكرة مما تفعله.

نصائح أخرى

دع نظام التشغيل المستخدم يستخدم رعاية هذا.

صورة جافا الجارية التي تمثل صفحات جزئيا إلى مبادلة هي صورة جافا ميتة. بمجرد أن يركل GC حريصة كافية، تحصل على صفحة كل شيء مرة أخرى في. الصفحة في سيئة بما فيه الكفاية. إذا لم يكن لديك بالفعل ذاكرة الوصول العشوائي الكافية للشيء بأكمله، فأنت في نهاية المطاف مع حطام لا يستجيب للخادم. جافا المقسمات سيئة (TM).

إذا كان لديك ما يكفي من ذاكرة الوصول العشوائي لكل شيء، فلن تحتاج إلى مبادلة على الإطلاق.

قم بالاشياء قائمتك في جدول قاعدة البيانات، على القرص، فهرس، حدد مجموعات النتائج الخاصة بك، وجعل الاستعلامات المناسبة ضدها. سيكون من الصافي الفوز، ويمكن ل DB التخزين المؤقت للصفحات التي تحبها بشكل أفضل، لذلك لا تضطر إلى التفكير في الأمر.

أو الحصول على المزيد من ذاكرة الوصول العشوائي.

يدير نظام التشغيل الخاص بك تلقائيا ذاكرته الخاصة ويدفع الأمور إلى Swapfile حسب الحاجة.

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

تحرير: لا يجب عليك بالضرورة إعداد آلة قاعدة بيانات مخصصة. بالنظر إلى أنك تحاول حاليا تخزين جميع بياناتك في الذاكرة الآن، فمن المحتمل أن تستخدم قاعدة بيانات قابلة للتطبيق مثل hsqldb. أو sqlite., ، والتي لديها حدود حجم 16 جيجابايت و 2 تيرابايت، على التوالي.

أجد أنه من المثير للاهتمام أن كل شخص يخبره بأن تخزين العناصر الموجودة على القرص غير معروف بشكل رهيب، وفي الوقت نفسه يوصى باستخدام قاعدة بيانات، وربما يتم تشغيل قاعدة بيانات عن بعد تخزين البيانات على القرص .. على جهاز آخر ..

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

بالطبع أثناء ظل خاطئ، كل الحق في حد ما .. ستكون قاعدة بيانات محلية هي الطريقة الأكثر فعالية لتخزين البيانات إلى ملف (حيث سيتم كتابة وقراءة). إذا لم يكن لديك أي حق الوصول إلى قاعدة بيانات محلية ثم رمز واحد. تم تصميم Hashmap ليتم تخزينها في الذاكرة ومصممة قائمة مرتبطة مفهرسة مرتبة ليتم تخزينها على القرص. تحاول أن تدفع مباشرة من الذاكرة إلى القرص دون بعض النظر في كفاءة كلا الوسطيتين غير فعالة.

ماذا عن هذا كنظرة مختلفة لنفس المشكلة:أقوم بإنشاء الكثير من ملفات PDF من جانب الخادم، ولدي 10 آلاف من العملاء الذين يرغبون عمومًا في تشغيل التقارير في نفس الوقت من الشهر.قد يكون متوسط ​​حجم ملف PDF 7-10 ميجابايت.مع توفر الكومة المحدودة، يعد "تبديل" البيانات إلى ملف مؤقت طريقة صالحة لإنشاء ملفات PDF لأنني بحاجة إلى أن أكون قادرًا على ضبط طول المحتوى على الاستجابة قبل دفق بيانات PDF إلى العميل.

ربما بدلاً من مجرد التشكيك في التصميم، قد تكون بعض الخيارات المفيدة مفيدة.أنا شخصياً أتطلع إلى استخدام ملف مؤقت واحد لكل عملية أو الوصول المتزامن لملف "مبادلة" واحد.

ما اقتراحك؟

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