2011-10-14 4 views
10

मैं कुछ छवि मैनिपुलेशन करने के लिए पीआईएल (पायथन छवि लाइब्रेरी) का उपयोग कर रहा हूं, विशेष रूप से मैं एक साथ छवियों को सिलाई कर रहा हूं।मैं कैसे पता लगा सकता हूं कि पीआईएल कार्यों का उपयोग क्यों स्मृति त्रुटि में होता है?

मेरा कोड छोटी मात्रा में कुछ छवियों के लिए ठीक काम करता प्रतीत होता है, लेकिन कभी-कभी मैं और MemoryError प्राप्त करता हूं।

भाग जो मेरे लिए विशेष रूप से अजीब बात है कि मैं बिट छवियों पर कुशलता नहीं कर रहा हूं, यह सब 0k10kb के तहत 10 छवियों के साथ काम करता है।

मैं Image.resize पर बहुत सी कॉल कर रहा हूं, लेकिन मुझे आश्चर्य है कि इससे महत्वपूर्ण मुद्दे हैं।

Traceback (most recent call last):                                    
    File "test.py", line 15, in <module>                                   
    pprint(scale_matrix_down((90,90), [inpt]))                                 
    File "/Users/jeremykarmel/Desktop/Python/merger.py", line 105, in scale_matrix_down                        
    return [shrinkRow(row, row_width_overflow(row)) for row in matrix]                           
    File "/Users/jeremykarmel/Desktop/Python/merger.py", line 103, in shrinkRow                          
    rest   = [shrinkIm(im, pixels_per_im) for im in row[remaining_pixels:]]                         
    File "/Users/jeremykarmel/Desktop/Python/merger.py", line 110, in shrinkIm                          
    return im.resize((im.size[0] - num_pix, im.size[1] - num_pix))                            
    File "/Library/Python/2.7/site-packages/PIL/Image.py", line 1302, in resize                          
    im = self.im.resize(size, resample)                                   
MemoryError 

ध्यान रखें छवियों सभी कम से कम 90x90 पिक्सल हैं:

यहाँ ढेर ट्रैक है।

मैं एक मृत अंत में बहुत अधिक हूं और वास्तव में यह सुनिश्चित नहीं करता कि आगे कैसे बढ़ना है। स्मृति जारी करने के लिए मैं क्या कर सकता हूं? क्या मुझे डेल ऑपरेटर को कॉल करना चाहिए या क्या मैं कुछ आसान कर सकता हूं? आपकी मदद के लिए अग्रिम धन्यवाद!

+3

यह सुनिश्चित करने के लिए जांचें कि आप नकारात्मक आकार का आकार नहीं दे रहे हैं। जब आप प्रक्रिया को चलाते हैं तो यह देखने के लिए मेमोरी उपयोग देखें कि स्मृति मरने से पहले आकार में बढ़ रहा है या नहीं। –

+0

धन्यवाद विंस्टन, आप बिल्कुल सही थे! – jkarm

उत्तर

8

यह पता चला है कि यह वास्तव में एक स्मृति त्रुटि नहीं है। जैसा कि विंस्टन ईवर्ट ने इंगित किया था कि मैं वास्तव में छवियों का आकार बदलने के तरीके में नकारात्मक मानकों को खिला रहा था।

हालांकि पाइथन दस्तावेज कहता है कि स्मृति त्रुटियों में स्मृति त्रुटियों के लिए समस्याएं हैं, तो जब आप आकार बदलने के लिए नकारात्मक पैरा देते हैं तो यह त्रुटि फेंक दी जाती है। मेरा संदेह यह है कि चूंकि पीआईएल सी पुस्तकालयों को भारी रूप से लेता है, इसलिए वे अमान्य इनपुट के साथ रिसाव का कारण बन सकते हैं और चूंकि लाइब्रेरी जांच की सीमा नहीं करता है, इसलिए त्रुटि बस बुलबुले हो जाती है।

8

व्याख्या करने के लिए क्या वास्तव में होता है:

  1. आप एक नकारात्मक चौड़ाई
  2. जनहित याचिका का आकार बदला छवि फिट करने के लिए एक नकारात्मक आकार की चित्र आवंटित करने के लिए कोशिश करता है के लिए एक छवि का आकार करने की कोशिश
  3. जनहित याचिका एक साथ malloc कॉल नकारात्मक आकार की छवि को पकड़ने के लिए स्मृति की नकारात्मक मात्रा
  4. malloc एक size_t लेता है जो हस्ताक्षरित है। नतीजतन, ऋणात्मक स्मृति अनुरोध को एक बड़ी संख्या के रूप में एक नकारात्मक संख्या के रूप में व्याख्या किया जाता है।
  5. malloc कुछ बड़े आवंटित नहीं कर सकता, तो यह एक त्रुटि
  6. पैदा करता जनहित याचिका करने के लिए वास्तव में यह स्मृति त्रुटि के बाहर तो यह इस तरह के

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

जैसा होता है, वास्तव में स्मृति को चलाने में मुश्किल होती है क्योंकि ओएस वर्चुअल मेमोरी का उपयोग करके प्रक्रिया को जारी रखने के लिए बहुत मेहनत करेगा। स्मृति समाप्त होने के बिंदु पर पहुंचने से पहले आपका सिस्टम नीचे गिर जाएगा। इसलिए मैंने पाया है कि स्मृति की नकारात्मक मात्रा के अनुरोधों के कारण अधिकांश स्मृति त्रुटियां होती हैं। जहां तक ​​मुझे याद है, जावा में संभवतः एक वर्चुअल मशीन के उपयोग के कारण मुझे केवल वास्तविक आउट-ऑफ-मेमोरी त्रुटियां मिली हैं।

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