سؤال

أحتاج إلى بنية خريطة مدعومة بالقرص لاستخدامها في تطبيق Java. يجب أن يكون لها المعايير التالية:

  1. قادرة على تخزين ملايين السجلات (حتى المليارات)
  2. البحث السريع - غالبية العمليات على الخريطة ببساطة لمعرفة ما إذا كان هناك مفتاح موجود بالفعل. هذا ، و 1 أعلاه هي المعايير الأكثر أهمية. يجب أن يكون هناك فعالة في آلية التخزين المؤقت للذاكرة للمفاتيح المستخدمة بشكل متكرر.
  3. ثابت ، ولكن لا يحتاج إلى أن يكون المعاملات ، يمكن أن يعيش مع بعض الفشل. لا يسعدني التزامن مع القرص بشكل دوري ، ولا يحتاج إلى أن يكون معاملات.
  4. قادرة على تخزين أنواع بدائية بسيطة - لكنني لست بحاجة إلى تخزين الأشياء المسلسل.
  5. لا يلزم توزيعه ، أي سيتم تشغيل كل شيء على جهاز واحد.
  6. سهل الإعداد ومجاني للاستخدام.
  7. لا مطلوب استفسارات علائقية

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

أستخدم حاليًا BDB JE ولكني أبحث عن خيارات أخرى.


تحديث

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

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

المحلول

من المحتمل أن أستخدم قاعدة بيانات محلية. مثل القول BDB JE أو HSQLDB. هل لي أن أسأل ما هو الخطأ في هذا النهج؟ يجب أن يكون لديك سبب للبحث عن بدائل.

ردا على التعليقات: كأداء المشكلة وأعتقد أنك تستخدم بالفعل JDBC للتعامل مع هذا قد يكون من المفيد تجربة HSQLB وقراءة الفصل في استخدام الذاكرة والقرص.

نصائح أخرى

JDBM3 يفعل بالضبط ما تبحث عنه. إنها مكتبة من الخرائط المدعومة من القرص مع واجهة برمجة تطبيقات بسيطة حقًا وأداء عالي.

تحديث

لقد تطور هذا المشروع الآن إلى MAPDB http://www.mapdb.org

قد ترغب في النظر في OrientDB.

يمكنك تجربة Java Chronicles من http://openhft.net/products/chronicle-map/خريطة Chronicle هي قيمة عالية ، خارجية ، قيمة رئيسية ، في الذاكرة ، مستمر في متجر البيانات. إنه يعمل مثل خريطة جافا القياسية

اعتبارًا من اليوم ، سأستخدم إما MAPDB (المزامنة المستندة إلى الملف/المدعوم أو غير متزامن) أو Hazelcast. في وقت لاحق ، سيتعين عليك تنفيذ استمرارك ، أي بدعم من RDBMS من خلال تطبيق واجهة Java. openhft قد يكون Chronicle خيارًا آخر. لست متأكدًا من كيف يعمل الثبات هناك لأنني لم أستخدمه مطلقًا ، ولكن المطالبة بوجود واحد. OpenHFT خارج الكومة تمامًا ويسمح بتحديثات جزئية للكائنات (من البدائية) دون التسلسل (إلغاء) ، والتي قد تكون فائدة أداء.

ملاحظة: إذا كنت بحاجة إلى قرص الخريطة القائم بسبب مشكلات الذاكرة ، فإن الخيار الأسهل هو MAPDB. يمكن استخدام Hazelcast كذاكرة التخزين المؤقت (الموزعة أم لا) والتي تتيح لك إخلاء العناصر من كومة بعد الوقت أو الحجم. OpenHft خارج الكومة ويمكن النظر فيه إذا كنت بحاجة فقط إلى استمرار لإعادة تشغيل JVM.

لقد وجدت مجلس الوزراء طوكيو لتكون علامة تجزئة/خريطة مستمرة بسيطة ، وبسرعة لإعداد واستخدام.

هذا المثال المختصر ، مأخوذ من المستندات, ، يوضح مدى بساطة حفظ البيانات واستردادها من خريطة ثابتة:

    // create the object
    HDB hdb = new HDB();
    // open the database
    hdb.open("casket.tch", HDB.OWRITER | HDB.OCREAT);
    // add item 
    hdb.put("foo", "hop");
    hdb.close();

sqlite يفعل هذا. كتبت غلاف لاستخدامه من جافا: http://zentus.com/sqlitejdbc

كما ذكرت في تعليق ، لقد استخدمت بنجاح sqlite مع gigabytes من البيانات والجداول لمئات الملايين من الصفوف. إذا كنت تفكر في الفهرسة بشكل صحيح ، فسيكون ذلك سريعًا جدًا.

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

ذاكرة التخزين المؤقت Jboss (شجرة) هو خيار رائع. يمكنك استخدامه مستقل من JBOSS. قوية جدا ، أداء ، ومرنة.

أظن شظايا السبات قد تفي بسهولة بجميع متطلباتك.

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