سؤال

لدي تطبيق iPhone مع NSARRAY كبيرة متداخلة من السلاسل. يذهب NSArray 3 مستويات عميقة، وهناك ما مجموعه 15000 سلاسل تقريبا في أعمق المستويات. الغالبية العظمى من السلاسل لديها أقل من 20 حرفا. في كثير من الأحيان، توقف تطبيقي لفترة من الوقت، ثم يستأنف العمل بعد 5-25 ثانية أو نحو ذلك. من الواضح أن هذا غير مقبول. إذا قمت بتشغيل التطبيق مع 2000 فقط من السلاسل، فإن معلقة تصبح نادرا كثيرا. لذلك أنا متأكد من أن NSArray كبير يسبب المشكلة.

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

بالمناسبة، يتم تخزين NSARRAY حاليا في فئة Singleton.

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

المحلول

في حين أن هياكل البيانات الأخرى (TRIE) تتبادر إلى الذهن، فإن الأسئلة الحقيقية هي:

(1) هل لديك أو يمكنك التعريف مع الأدوات أثناء هذه المعلقة

ومع افتراض غير صحيح غير ضروري أن الصفائف هي مشكلتك

(2) ما هي العمليات التي تقوم بها في الصفائف؟

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

نصائح أخرى

مع وجود العديد من السلاسل، لا توجد وسيلة لديك في طاولة في وقت واحد (أليس كذلك ؟؟؟).

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

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

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