2010-06-13 14 views
7

के लिए कम मेमोरी पदचिह्न के साथ सीएसवी पार्सर इंस्ट्रूमेंट्स के साथ अपने ऐप का परीक्षण करने के बाद मुझे एहसास हुआ कि वर्तमान CSV parser का उपयोग करने में मुझे एक बड़ी मेमोरी पदचिह्न है। क्या किसी के पास कम स्मृति पदचिह्न वाला एक के लिए सिफारिश है?आईएसओ

+0

[सीएसवी पार्स करने के लिए शीर्ष 6 तरीके? उच्च प्रदर्शन!] (Http://izlooite.blogspot.com/2011/06/top-6-ways-to-parse-csv-high.html) –

उत्तर

5

आपको शायद पूरी फ़ाइल पढ़ने, इसे पार्स करने और इसमें सभी पंक्तियों के साथ एक सरणी लौटने के बजाय, यह पंक्ति-दर-पंक्ति करना चाहिए। किसी भी मामले में, आपके द्वारा लिंक किया गया कोड लूप में अस्थायी वस्तुओं के ज़िलियन उत्पन्न करता है, जिसका अर्थ है कि इसमें बहुत अधिक मेमोरी ओवरहेड होगा।

एक त्वरित सुधार पाश की कलम में एक NSAutoreleasePool बनाने के लिए किया जाएगा, और नीचे यह नाली:

while (![scanner isAtEnd]) {   
    NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc] init]; 

... कोड का गुच्छा ...

[innerPool drain]; 
} 

यह अस्थायी वस्तुओं को मिटा देगा, इसलिए आपकी मेमोरी उपयोग डेटा का आकार होगा, साथ ही फाइल में प्रत्येक स्ट्रिंग के लिए ऑब्जेक्ट (लगभग 8 बाइट्स * पंक्तियां * कॉलम)

3

कुछ अन्य सीएसवी पारसर्स कोशिश करने के लिए कर रहे हैं:

यदि या तो कम स्मृति भूमि के ऊपर है को देखने के लिए प्रयोग कर सकते हैं।

इनमें से कोई भी "ईवेंट आधारित" पार्सिंग का समर्थन नहीं करता है। ईवेंट आधारित पार्सिंग में, आप पूरी स्रोत फ़ाइल को स्मृति में कभी भी लोड नहीं करते हैं, वर्तमान पंक्ति को पढ़ने के लिए पर्याप्त फ़ाइल (आप इसे डाउनलोड पर भी प्रगति कर सकते हैं)। आपको प्रत्येक पंक्ति को पढ़ना चाहिए जैसा कि इसे पढ़ा जाता है और स्रोत से कुछ डेटा को पंक्तियों के बीच मुक्त किया जाता है।

यह सैद्धांतिक निम्नतम ओवरहेड समाधान होगा। यदि आपको वास्तव में कम ओवरहेड की आवश्यकता है, तो आपको ऐसा करने के लिए मौजूदा समाधान को अनुकूलित करना चाहिए (मुझे इस बारे में कोई सलाह नहीं है कि यह कैसे किया जाएगा)।

+0

थक्स मैट। मैंने इस समय के लिए मार्क्स समाधान के साथ जाने का फैसला किया क्योंकि इसके लिए पार्सर्स स्विच करने के बाद कम परीक्षण की आवश्यकता होती है। लेकिन किसी ईवेंट आधारित पार्सर पर स्विच करना अब मेरे रोडमैप पर है। Libcsv (http://sourceforge.net/projects/libcsv/) एक जैसा लगता है। – catlan

0

यह एक CSV पार्सर नहीं है, लेकिन मेरा खुली खट्टा सी कोको पार्सकिट फ्रेमवर्क में एक शक्तिशाली/सुविधाजनक/कॉन्फ़िगर करने योग्य स्ट्रिंग टोकनेज़र है जो सीएसवी या अन्य प्रकार के पार्सिंग/टोकनिंग के लिए आसान हो सकता है।

ढांचा:

http://parsekit.com

कुछ उपयोग प्रलेखन:

http://parsekit.com/tokenization.html

PKTokenizer वर्ग:

http://github.com/itod/parsekit/blob/master/include/ParseKit/PKTokenizer.h http://github.com/itod/parsekit/blob/master/src/PKTokenizer.m

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