2011-01-12 18 views
7

पीडीएफ रीडर के लिए मैं प्रत्येक पृष्ठ के 'स्क्रीनशॉट' ले कर और उन्हें डिस्क पर सहेजकर एक दस्तावेज़ तैयार करना चाहता हूं।पीडीएफ मेमोरी आवंटन (CGPDFDocumentRef)

MEMORY BEFORE:   6 MB 
MEMORY DURING 1ST DOC: 40 MB 
MEMORY AFTER 1ST DOC: 25 MB 
MEMORY DURING 2ND DOC: 40 MB 
MEMORY AFTER 2ND DOC: 25 MB 
.... 
: सबसे पहले दृष्टिकोण

CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef) someURL); 
for (int i = 1; i<=pageCount; i++) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];  
    CGPDFPageRef page = CGPDFDocumentGetPage(document, i); 
    ...//getting + manipulating graphics context etc. 
    ... 
    CGContextDrawPDFPage(context, page); 
    ... 
    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext(); 
    ...//saving the image to disc 
    [pool drain]; 
} 
CGPDFDocumentRelease(document); 

यह जो लूप के पहली बार चलाने के बाद जारी होने की नहीं लगती है स्मृति का एक बहुत में परिणाम (1 दस्तावेज़ की तैयारी कर रहा है), लेकिन अतिरिक्त रन में कोई और अप्रकाशित स्मृति है

for (int i = 1; i<=pageCount; i++) 
{ 
    CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef) someURL); 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];  
    CGPDFPageRef page = CGPDFDocumentGetPage(document, i); 
    ...//getting + manipulating graphics context etc. 
    ... 
    CGContextDrawPDFPage(context, page); 
    ... 
    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext(); 
    ...//saving the image to disc 
    CGPDFDocumentRelease(document); 
    [pool drain]; 
} 

करने के लिए कोड बदलने

करने के लिए स्मृति के उपयोग में परिवर्तन

लेकिन प्रदर्शन में स्पष्ट रूप से एक कदम पीछे है।

जब मैं पहली बार मामला कोई और अधिक स्मृति आवंटित किया जाता है में एक पीडीएफ (बाद में समय में, विभिन्न धागा) पढ़ना शुरू (25 MB में रह) है, जबकि दूसरे मामले में स्मृति (7 से) अप करने के लिए 20 एमबी चला जाता है।

दोनों मामलों में, जब मैं CGContextDrawPDFPage(context, page); लाइन मेमोरी को हटाता हूं, लगभग 6 एमबी पर दस्तावेजों की सभी तैयारी के दौरान और लगभग स्थिर होता है।

क्या कोई बता सकता है कि वहां क्या चल रहा है?

उत्तर

4

CGPDFDocument कैश बहुत आक्रामक तरीके से और आपके पास बहुत कम नियंत्रण है - जैसा कि आपने किया है - दस्तावेज़ जारी करना और डिस्क से इसे पुनः लोड करना।

जब आप CGContextDrawPDFPage कॉल को हटाते हैं तो बहुत सारे आवंटन नहीं देखते हैं कि क्वार्ट्ज पृष्ठ संसाधनों को आलसी लोड करता है। जब आप केवल CGPDFDocumentGetPage को कॉल करते हैं, तो ऐसा होता है कि यह कुछ बुनियादी मेटाडेटा लोड करता है, जैसे कि बाउंडिंग बॉक्स और एनोटेशन (स्मृति में बहुत छोटा)।

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

+0

धन्यवाद, मुझे समझ में आता है, इसलिए मैंने इसे वास्तव में साबित किए बिना "दाएं" के रूप में चिह्नित किया। –

+1

हाय omz। विस्तृत स्पष्टीकरण के लिए धन्यवाद। मुझे एक ही समस्या है, जब मैं पृष्ठों को प्रतिपादित करता रहता हूं और कुछ समय के बाद ऐप क्रैश हो रहा है तो स्मृति उपयोग बहुत बढ़ रहा है। मैं प्रत्येक पृष्ठ के लिए अलग-अलग पीडीएफ दस्तावेज़ का उपयोग कर रहा हूं (केवल एक पृष्ठ) जिसे ड्रॉलेयर में बनाया और जारी किया गया है: inContext: method.please मुझे पृष्ठ सामग्री के इस ऑटो कैशिंग से बचने और स्मृति उपयोग को कम करने के लिए एक सुझाव दें। – Hariprasad

+0

@ हरिप्रसाद मुझे आपके साथ थोड़ा सा समस्या है। और मुझे वहां कोई समाधान नहीं मिल रहा है। कुछ कहते हैं कि ढांचे की बग दूसरों को रिहा कर रही है, लेकिन मुझे लगता है कि मैंने सब कुछ जारी किया था। मेरे पास लीक या कुछ भी नहीं है और फिर भी कुछ बिंदु पर दुर्घटनाग्रस्त हो जाएगा। क्या आपको इसके लिए समाधान मिला है? – otakuProgrammer

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