ما مدى كفاءة استخدام قاعدة بيانات الذاكرة لتخزين ملايين القيم المؤقتة؟

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

سؤال

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

القصة الكاملة هنا, ، إذا كنت بحاجة إلى مزيد من التفاصيل.

أحد الحلول التي تم اقتراحها هو استخدام قاعدة بيانات في الذاكرة.

لذا ، إذا ذهبت مع هذا الحل ، فسوف أستخدم قاعدة البيانات هذه لتخزين قيمي في جدول لاستبدال الحالي الخاص بي Map<String, List<Double>>, ، مثل:

create table CALCULATION_RESULTS_XXX (
  deal_id varchar2,
  values number
);

(جدول واحد لكل حساب ، XXX هو معرف الحساب)

لذلك أثناء الحساب ، سأفعل ما يلي:

  1. عند بدء الحساب ، أقوم بإنشاء ملف CALCULATION_RESULTS_XXX الطاولة.
  2. في كل مرة أحتاج إلى إضافة قيمة ، أدخل سجلًا في هذا الجدول.
  3. في نهاية الحساب ، أستخدم محتوى الجدول للخوارزمية الخاصة بي.
  4. أخيرًا ، أسقط هذا الجدول.

كما هو موضح في الآخر موضوعات, ، في الوقت الحالي ، قد يخزن حسابي عدة مئات من البيانات في الذاكرة ، كقائمة من 30 * 1،000،000 من Double سوف تحتاج حوالي 240 ميجابايت.

الأسئلة الآن:

  1. إذا ذهبت مع قاعدة بيانات في الذاكرة ، فهل ستنخفض استثمار الذاكرة الخاص بي؟
  2. ما هي النقاط المحددة التي سيتعين علي العناية بها فيما يتعلق باستخدام قاعدة البيانات (أو إنشاء الجدول) ، وإدراج البيانات ، وما إلى ذلك؟
  3. أعتقد أنني سأختار قاعدة بيانات H2. هل تعتقد أنه الخيار الأفضل لاحتياجاتي؟
هل كانت مفيدة؟

المحلول

المشكلة بسيطة بما فيه الكفاية لدرجة أنك تحتاج حقًا إلى إعطائها نظرة ومعرفة كيف تعمل نتائج (الأداء).

لديك بالفعل تطبيق يستخدم فقط هياكل في الذاكرة. شخصيا ، بالنظر إلى أنه حتى أرخص جهاز كمبيوتر من Dell يأتي مع 1 جيجابايت+ من ذاكرة الوصول العشوائي ، يمكنك أيضًا التمسك بذلك. وبصرف النظر عن ذلك ، يجب أن يكون الأمر بسيطًا إلى حد ما في قاعدة بيانات أو اثنين. كنت أفكر في Sleepycat Berkerly DB (التي تملكها الآن Oracle ...) ، لأنك لست بحاجة إلى استخدام SQL ويجب أن تكون فعالة تمامًا. (إنهم يدعمون جافا).

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

نصائح أخرى

Hashmap بسيط مدعوم من قبل التراكوتا من الأفضل أن تسمح بتخزين مجموعة أكبر ثم الذاكرة الافتراضية JVM.

ستضيف قواعد البيانات المدمجة ، وخاصة قواعد SQL ، التعقيد والنفقات العامة إلى الكود الخاص بك ، لذلك لا يستحق ذلك. إذا كنت بحاجة حقًا إلى تخزين مستمر مع وصول عشوائي ، جرب واحدة من DBS NOSQL ، مثل Couchdb, كاساندرا, neo4j

لا أعرف ما إذا كان سيكون أسرع ، لذلك يجب عليك تجربته. ما أريد أن أوصي به هو القيام بإدراج الدُفعات لقائمة كاملة عندما لا تحتاج على الفور بعد الآن. لا تحفظ القيمة بالقيمة :)

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

هذا ليس كثيرًا ولكنه أفضل على الأقل من إجابة واحدة مقطوعة :)

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

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