سؤال

إذا كان لدي ثابت الخريطة التي قد أتوقعها (على مدى فترة زمنية قصيرة جدًا - مثل بضع ثوان) لإضافة/إزال مئات الآلاف من العناصر من ، هو المعيار HashMap فكرة سيئة؟ دعنا نقول أنني أريد تمرير بيانات 1 جيجابايت من خلال الخريطة في أقل من 10 ثوانٍ بحيث يكون الحد الأقصى لحجم الخريطة في أي مرة واحدة فقط 256 ميجابايت.

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

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

هل سأكون أفضل حالًا مع تطبيق خريطة مختلف ، وإذا كان الأمر كذلك ، فما هو؟

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

المحلول

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

التغير رائع ، لكن هذا لا يبدو لي مثل الوقت لاستخدامه. لو كنت أنت ، كنت متمسكًا به scala.collection.mutable.HashMap. إذا كنت بحاجة إلى وصول متزامن ، فقم بلف Java util.concurrent بدلاً من ذلك.

قد ترغب أيضًا في زيادة حجم الجيل الشاب في JVM: -Xmn1G أو أكثر (على افتراض أنك تعمل مع -Xmx3G). أيضا ، استخدم جامع القمامة (الموازي).

نصائح أخرى

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

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

بالمناسبة ، أ ConcurrentHashMap لن يكون له معنى في هذا التصميم ، بالنظر إلى أن الخريطة يمكن الوصول إليها من ممثل واحد (هذا ما أفهمه من الوصف).

يتم تقسيم خريطة Scala ما يسمى (*) غير القابلة للتغيير إلى ما وراء الاستخدام الأساسي حتى Scala 2.7. لا تثق بي ، فقط ابحث عن عدد التذاكر المفتوحة لذلك. والحل هو مجرد "سيتم استبداله بشيء آخر على Scala 2.8" (وهو ما فعلته).

لذا ، إذا كنت تريد خريطة ثابتة لـ Scala 2.7.x ، فإنني أنصح بالبحث عنها في شيء آخر غير سكالا. أو مجرد استخدام TreehashMap بدلاً من ذلك.

(*) خريطة سكالا غير القابلة للتغيير ليست غير قابلة للتغيير. إنه بنية بيانات قابلة للتغيير داخليًا ، والتي تتطلب الكثير من التزامن.

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