سؤال

أنا أستخدم NsKeyEdarchiver في برنامج Mac OS X الذي ينشئ بيانات لتطبيق iPhone. اكتشفت أنه بشكل افتراضي ، فإن المحفوظات الناتجة أكبر بكثير مما كنت أتوقع. مثال:

NSMutableArray * ar = [NSMutableArray arrayWithCapacity:10];

for (int i = 0; i < 100000; i++) {
    NSString * s = [NSString stringWithFormat:@"item%06d", i];
    [ar addObject:s];
}
[NSKeyedArchiver archiveRootObject:ar toFile: @"NSKeyedArchiver.test"];

هذا يخزن 10 * 100000 = 1M بايت من البيانات المفيدة ، ومع ذلك فإن حجم الملف الناتج هو ما يقرب من ثلاثة ميغابايت. يبدو أن النفقات العامة تنمو مع عدد من العناصر في الصفيف. في هذه الحالة ، بالنسبة إلى 1000 عنصر ، كان الملف حوالي 22 ألفًا.

تشير "الملف" إلى أنه "قائمة خاصية Apple Binary" (وليس تنسيق XML).

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

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

المحلول

قدمت خطأ لتتبع هذا.

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

بالنسبة للبيانات المهيكلة الهرمية بدلاً من شبكات الكائنات التعسفية ، جرب nspropertylisterialization. أرى 1.8 ميجابايت ل plist ثنائي.

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