2011-10-21 11 views
8

मेरे पास 215 एमबी सीएसवी फ़ाइल है जिसे मैंने अपने स्वयं के कस्टम ऑब्जेक्ट्स में लिपटे कोर डेटा में पार्स किया है और संग्रहीत किया है। समस्या यह है कि मेरा कोर डेटा स्क्लाइट फ़ाइल लगभग 260 एमबी है। सीएसवी फ़ाइल में मेरे शहर की ट्रांजिट सिस्टम (बस स्टॉप, टाइम्स, रूट इत्यादि) पर डेटा की लगभग 4.5 मिलियन लाइनें हैं।कोर डेटा स्क्लाइट फ़ाइल आकार को आप कम या संपीड़ित कैसे करेंगे?

मैं गुण ताकि रोक बार प्रतिनिधित्व करने वाले तार के सरणियों बजाय NSData फ़ाइलों के रूप में, लेकिन किसी कारण फ़ाइल आकार अभी भी 260MB के आसपास पर बनी हुई है के लिए जमा हो जाती है को संशोधित करने की कोशिश की है।

मैं इस आकार को ऐप नहीं भेज सकता। मुझे संदेह है कि कोई भी 260 एमबी ऐप डाउनलोड करना चाहेगा, भले ही इसका मतलब है कि उसके पास पूरे शहर का ट्रांज़िट शेड्यूल है।

वहाँ हैं सेक या इस्तेमाल किया (भले ही उससे नहीं कोर डेटा का उपयोग कर, मैं सुझाव सुनने के लिए तैयार हूँ) भंडारण स्थान को कम करने के लिए किसी भी तरीके?

संपादित करें: मैं अभी अभी एक अपडेट प्रदान करना चाहता हूं क्योंकि मैं अविश्वास में फ़ाइल आकार पर देख रहा हूं। सामान्य रूप से स्ट्रिंग्स, इंडेक्सिंग और डेटाबेस सामान्यीकरण से जुड़े कुछ चालाक हेरफेर के साथ, मैंने संपीड़ित होने पर आकार को 6.5 एमबी या 2.6 एमबी तक कम करने में कामयाब रहा है। कोर डेटा में संग्रहीत लगभग 105,000 ऑब्जेक्ट्स जिनमें शहर की ट्रांजिट सिस्टम का पूरा विवरण शामिल है। मैं आँसू अभी डी 'में लगभग हूँ:

+0

मैंने अभी आपके अंतिम आकार के बारे में आपकी अपडेट की गई टिप्पणी देखी है। बहुत प्रभावशाली। 100: वास्तविक दुनिया के डेटा के 1 संपीड़न को किसी को गर्व करना चाहिए। –

+0

बहुत देर हो चुकी है, लेकिन यदि आप एप ट्रांजिट की जांच करते हैं, तो मैंने उनसे बात की है और वे केवल ** 800 केबी ** – Milo

उत्तर

0

आप कुछ डेटाबेस सामान्य प्रदर्शन करने में सक्षम हो सकता है। कुछ भी है कि निरर्थक या एक ही मान एकाधिक पंक्तियों में संग्रहीत किया जा रहा हो सकता है के लिए

देखो। आपको शायद अपने डेटाबेस को पुन: स्थापित करने की आवश्यकता होगी ताकि इन डुप्लिकेट मान (यदि कोई हों) अलग-अलग तालिकाओं में संग्रहीत किए जाएं और फिर आईडी के माध्यम से उनकी मूल पंक्ति से संदर्भित किया जाए।

0

एसक्लाइट फ़ाइल कितनी बड़ी है? यदि यह संतोषजनक रूप से छोटा है, तो सबसे आसान चीज इसे संपीड़ित करने के लिए होगी, फिर इसे एनएससीएच डायरेक्टरी पर असम्पीडित करें।

+0

तक 260 एमबी नीचे प्राप्त करने में कामयाब रहे हैं "संपीड़ित" से मेरा मतलब gzip, btw से संपीड़ित था। –

+0

gzipped होने पर फ़ाइल 57.7MB है। आप यहां कुछ हो सकते हैं। मेरी एकमात्र चिंता यह है कि यह आम तौर पर फोन को असम्पीडित करने में कितना समय लगेगा। –

8

जब तक आपकी मूल CSV एक बहुत मूर्ख ढंग से एन्कोड किया गया है, यह संभावना नहीं लगता है कि आकार 100M नीचे पाने के लिए, कोई फर्क नहीं पड़ता कि आप कितना यह सेक नहीं जा रहा है। यह अभी भी एक ऐप के लिए वास्तव में बड़ा है। समाधान आपके डेटा को वेब सेवा में ले जाना है। आप महत्वपूर्ण भागों को डाउनलोड और कैश करना चाह सकते हैं, लेकिन यदि आप लाखों रिकॉर्ड के बारे में बात कर रहे हैं, तो सर्वर से प्राप्त करना सबसे अच्छा लगता है। इसके अलावा, मुझे विश्वास करना है कि समय-समय पर ट्रांज़िट सिस्टम बदलता है, और एक बार स्टॉप एडजस्टमेंट होने पर हर बार 10-एमबी-एमबी ऐप को अपग्रेड करना निराशाजनक होगा।


मैंने कहा है कि, लेकिन वास्तव में वहाँ कुछ चीजें आप पर विचार कर सकते हैं: एक सा खेतों में

  • ले जाएँ बूलियन्स। आप 64 बूलियन को एनएसयूइंटर में डाल सकते हैं। (और यदि आपको केवल 8 बिट्स की आवश्यकता है तो पूर्ण 64-बिट पूर्णांक का उपयोग न करें। सबसे छोटी चीज़ को स्टोर करें।)
  • संपीड़ित करें कि आप समय कैसे स्टोर करते हैं। एक दिन में केवल 1440 मिनट हैं। आप इसे 2 बाइट्स में स्टोर कर सकते हैं। पारगमन के समय आमतौर पर दूसरे के लिए नहीं होते हैं; उन्हें एक CGFloat की आवश्यकता नहीं है।
  • सप्ताह और तिथियों के दिन इसी तरह संपीड़ित किए जा सकते हैं।
  • जाहिर है आपको किसी भी तार को सामान्य बनाना चाहिए। कई लाइनों पर डुप्लिकेट स्ट्रिंग मानों के लिए सीएसवी देखें।
  • मैं आम तौर पर इस तरह की समस्या के लिए कोर डेटा की बजाय कच्चे स्क्लाइट की सिफारिश करता हूं। कच्चे डेटा भंडारण की तुलना में कोर डेटा ऑब्जेक्ट दृढ़ता के बारे में अधिक है। तथ्य यह है कि आप सीएसवी पर 20% ब्लोट देख रहे हैं (जो स्वयं ही अत्यधिक कुशल नहीं है) इस समस्या के लिए एक अच्छी दिशा नहीं है।
  • यदि आप भी कठिन हो जाना चाहते हैं, और बहुत अच्छी खोज क्षमताओं की आवश्यकता नहीं है, तो आप पैक किए गए डेटा ब्लब्स बना सकते हैं। मैं फोन स्विच पर ऐसा करता था जहां स्मृति बेहद तंग थी। आप एक बिट फील्ड स्ट्रक्चर बनाते हैं और एक चर के लिए 5 बिट्स आवंटित करते हैं, और 7 बिट्स को दूसरे के लिए आवंटित करते हैं, आदि। इसके साथ, और कुछ समय चीजों को घुमाते हैं ताकि वे शब्द सीमाओं पर सही तरीके से लाइन कर सकें, तो आप बहुत तंग हो सकते हैं।

चूंकि आप अपने प्रारंभिक डाउनलोड आकार के बारे में सबसे अधिक ध्यान, और बाद में तेजी से पहुँच के लिए अपने डेटा का विस्तार करने के लिए तैयार हो सकता है, तो आप बहुत डोमेन-विशिष्ट संपीड़न विचार कर सकते हैं। उदाहरण के लिए, उपरोक्त चर्चा में, मैंने बताया कि एक समय के लिए 2 बाइट्स कैसे नीचे आना है। पिछली बार से डेल्टा मिनट के रूप में समय-समय पर स्टोर करके आप कई मामलों में 1 बाइट्स तक पहुंच सकते हैं (क्योंकि यदि आप बस और ट्रेन शेड्यूल हैं तो आपके ज्यादातर समय हमेशा छोटे कदमों से बढ़ रहे हैं)। डेटाबेस को छोड़कर, आप एक बहुत कसकर एन्कोडेड डेटा फ़ाइल बना सकते हैं जिसे आप पहले लॉन्च पर डेटाबेस में निकाल सकते हैं।

आप अपने तारों को छोटे टोकन में एन्कोड करने के लिए डोमेन-विशिष्ट ज्ञान का भी उपयोग कर सकते हैं। अगर मैं एनवाई सबवे सिस्टम एन्कोड कर रहा था, तो मुझे पता चलेगा कि कुछ तारों में बहुत कुछ दिखाई देता है, जैसे "एवेन्यू", "रोड", "स्ट्रीट", "ईस्ट" इत्यादि। मैं शायद उन्हें असम्पीड ASCII जैसे^ए,^आर,^एस,^ई, आदि। शायद मैं "138 स्ट्रीट" को दो बाइट्स (0x8A13) के रूप में एन्कोड करता हूं। यह निश्चित रूप से मेरे ज्ञान पर आधारित है कि è (0x8a) NY मेट्रो स्टॉप में कभी दिखाई नहीं देता है। यह एक सामान्य समाधान नहीं है (पेरिस में यह एक समस्या हो सकती है), लेकिन इसका उपयोग उस डेटा को अत्यधिक संपीड़ित करने के लिए किया जा सकता है जिसके बारे में आपके पास विशेष ज्ञान है। वाशिंगटन डीसी जैसे शहर में, मेरा मानना ​​है कि उनकी सर्वोच्च संख्या वाली सड़क 38 वीं सेंट है, और फिर एक 4-मूल्य दिशा है। तो आप इसे दो बाइट्स में एन्कोड कर सकते हैं, पहले "क्रमांकित सड़क" टोकन, और फिर चतुर्भुज के लिए 2 बिट्स और सड़क संख्या के लिए 6 बिट्स के साथ थोड़ा सा क्षेत्र। इस तरह की सोच संभावित रूप से आपके डेटा आकार को कम कर सकती है।

+0

मैं पूरी तरह से यहां आपसे सहमत हूं। हालांकि, ऐप ऑफ़लाइन संचालित करने में सक्षम होने का मतलब है जिसका अर्थ है कि सभी डेटा को शामिल करना होगा। अन्यथा यह वास्तव में मेरे दिमाग को पार कर गया था और आदर्श होगा। –

+0

हाँ; मैं सीएसवी को बेहतर तरीके से स्टोर करने के तरीके के बारे में बहुत कुछ सोच रहा था। मुझे लगता है कि बहुत सारे विकल्प हैं। सीएसवी वास्तव में वह कुशल नहीं है। मुझे लगता है कि आप जीजीआईपी से बाहर निकल सकते हैं, आप अधिक चालाक भंडारण समाधान से बेहतर हो सकते हैं। –

+0

आपकी विचारशील प्रतिक्रिया के लिए धन्यवाद रॉब। मैं डेटाबेस के माध्यम से चला गया और देखा कि बहुत सारी जानकारी दोहराई जा रही है, विशेष रूप से हेडलाइन, जो प्रत्येक स्ट्रिंग के रूप में संग्रहीत हैं। इसे खत्म करने के लिए अब कोड पर जा रहे हैं। मुझे डेल्टा समय का सुझाव पसंद है और वह एक शॉट देगा। उम्मीद है कि मैं इस जानवर को 200 एमबी से कम कर सकता हूं और उसके बाद इसे गीज़ कर सकता हूं और इसे पहले रन पर कैश फ़ोल्डर में निकाल सकता हूं। –

संबंधित मुद्दे