أفضل الممارسات لتخزين كميات كبيرة من البيانات باستخدام J2ME

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

  •  09-06-2019
  •  | 
  •  

سؤال

أقوم بتطوير تطبيق J2ME يحتوي على كمية كبيرة من البيانات لتخزينها على الجهاز (في حدود 1 ميجا بايت ولكنها متغيرة).لا يمكنني الاعتماد على نظام الملفات، لذا فأنا عالق في نظام إدارة السجلات (RMS)، الذي يسمح بمخازن سجلات متعددة ولكن لكل منها حجم محدود.النظام الأساسي المستهدف الأولي الخاص بي، Blackberry، يحد كل منها من 64 كيلو بايت.

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

هناك العديد من أنواع البيانات المختلفة التي يتم تخزينها، ولكن مجموعة واحدة فقط على وجه الخصوص ستتجاوز الحد الأقصى البالغ 64 كيلو بايت.

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

المحلول

لأي شيء يتجاوز بضعة كيلو بايت، تحتاج إلى استخدام JSR 75 أو خادم بعيد.سجلات RMS محدودة للغاية من حيث الحجم والسرعة، حتى في بعض الهواتف المتطورة.إذا كنت بحاجة إلى التوفيق بين 1 ميغابايت من البيانات في J2ME، فإن الطريقة الوحيدة الموثوقة والمحمولة هي تخزينها على الشبكة.يتم دائمًا دعم فئة HttpConnection وأساليب GET وPOST.

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

نصائح أخرى

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

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

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

لسوء الحظ، عندما يتعلق الأمر بـ JavaME، غالبًا ما تنجذب إلى كتابة متغيرات خاصة بالجهاز من التعليمات البرمجية الخاصة بك.

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

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

في نظام التشغيل Blackberry OS 4.6، تمت زيادة الحد الأقصى لحجم متجر RMS إلى 512 كيلو بايت، لكن هذا لا يساعد كثيرًا حيث من المحتمل ألا تدعم العديد من الأجهزة الإصدار 4.6.الخيار الآخر على Blackberry هو Persistent Store الذي يبلغ حد حجم السجل 64 كيلو بايت ولكن لا يوجد حد لحجم المتجر (بخلاف الحدود المادية للجهاز).

أعتقد أن كارلوس وإيزب على حق.

الأمر بسيط جدًا، استخدم JSR75 (FileConnection) وتذكر التوقيع على midlet الخاص بك بشهادة صالحة (موثوقة).

للقراءة فقط، أصل في أوقات مقبولة (خلال 10 ثوانٍ)، عن طريق فهرسة ملف مورد.لقد حصلت على تصديرين لقائمة أسعار ملف CSV بسعة 800 كيلو بايت تقريبًا.يتم ضغط فئات البرنامج وكلا الملفين إلى ملف JAR بسعة 300 كيلو بايت.

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

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

لقد بدأت للتو في البرمجة لـ JavaME، ولكن لدي خبرة في الإصدارات القديمة من PalmOS، حيث تكون جميع أجزاء البيانات محدودة الحجم، مما يتطلب تصميم هياكل البيانات باستخدام فهارس السجلات والإزاحات.

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

إن تطوير تطبيق J2ME لـ Blackberry دون استخدام مترجم .cod يحد من استخدام JSR 75 إلى حد ما، نظرًا لأننا لا نستطيع التوقيع على الأرشيف.كما أشار كارلوس، فهذه مشكلة على أي نظام أساسي ولقد واجهت مشكلات مماثلة باستخدام جزء PIM منه.يبدو أن نظام إدارة الموارد (RMS) بطيء بشكل لا يصدق على منصة بلاك بيري، لذلك لست متأكدًا من مدى فائدة نظام ملفات inode/b-tree في الأعلى، ما لم يتم تخزين البيانات مؤقتًا في الذاكرة وكتابتها إلى RMS في سلسلة رسائل خلفية ذات أولوية منخفضة.

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