2015-03-17 18 views
6

मैं पाइथन 3.4 (अम्पी 1.9.2 और पीआईएल.इमेज 1.1.7) के साथ उबंटू 14.04 पर काम कर रहा हूं। यहां मैं क्या करता हूं:जब मैं इस numpy सरणी को योग करने का प्रयास करता हूं तो पाइथन क्रैश क्यों होता है?

>>> from PIL import Image 
>>> import numpy as np 

>>> img = Image.open("./tifs/18015.pdf_001.tif") 
>>> arr = np.asarray(img) 
>>> np.shape(arr) 
(5847, 4133) 

>>> arr.dtype 
dtype('bool') 

# all of the following four cases where I incrementally increase 
# the number of rows to 700 are done instantly 
>>> v = arr[1:100,1:100].sum(axis=0) 
>>> v = arr[1:500,1:100].sum(axis=0) 
>>> v = arr[1:600,1:100].sum(axis=0) 
>>> v = arr[1:700,1:100].sum(axis=0) 

# but suddenly this line makes Python crash 
>>> v = arr[1:800,1:100].sum(axis=0) 

fish: Job 1, “python3” terminated by signal SIGSEGV (Address boundary error) 

मुझे लगता है कि पाइथन अचानक स्मृति से बाहर हो जाता है। यदि ऐसा है - मैं पाइथन को और अधिक मेमोरी कैसे आवंटित कर सकता हूं? जैसा कि मैं htop से देख सकता हूं मेरी 32 जीबी मेमोरी क्षमता भी दूरस्थ रूप से कम नहीं है।

आप टीआईएफएफ छवि here डाउनलोड कर सकते हैं।


अगर मैं एक खाली बूलियन सरणी बनाने के लिए, पिक्सल पर स्पष्ट रूप सेट और फिर योग लागू होते हैं - तो यह काम करता है:

>>> arr = np.empty((h,w), dtype=bool) 
>>> arr.setflags(write=True) 

>>> for r in range(h): 
>>>  for c in range(w): 
>>>   arr.itemset((r,c), img.getpixel((c,r))) 

>>> v=arr.sum(axis=0) 

>>> v.mean() 
5726.8618436970719 

>>> arr.shape 
(5847, 4133) 

लेकिन यह "वैकल्पिक हल" कॉपी करने के हर पिक्सेल लेता है के रूप में बहुत संतोषजनक नहीं है रास्ता बहुत लंबा - शायद एक तेज विधि है?

+2

एक विभाजन गलती * हमेशा * एक बग इंगित करता है। यहां तक ​​कि यदि पाइथन स्मृति से बाहर हो रहा था, तो स्मृति त्रुटि से बाहर फेंकने के बजाय विभाजन खंड में क्रैश होने के लिए यह एक बग होगा। –

+1

यह कल्पना की जा सकती है कि आप स्टैक स्पेस से बाहर हो रहे हैं। ऐसा नहीं है कि आप 10000 x 10000 यादृच्छिक मामले में ऐसा नहीं करते हैं, एरेगोरिदम में एक अंतर को इंगित कर सकता है जो सरणी खंड बनाम एक पूरे सरणी के लिए उपयोग किया जाता है। यदि खंडों के लिए एक रिकर्सिव एल्गोरिदम का उपयोग किया गया था, तो कई असंतुलित खंडों वाला एक सरणी अनुभाग बहुत गहराई से भर्ती कर सकता है और ढेर को समाप्त कर सकता है। यह निश्चित रूप से सभी सट्टा है। –

+0

पहला मामला खंडित नहीं होने पर भी क्रैश होगा और दूसरा मामला खंडित होने पर भी क्रैश नहीं होगा। – Raffael

उत्तर

3

मैं उबंटू रिपॉजिटरीज़ से स्थापित numpy v1.8.2/PIL v1.1.7 का उपयोग करके अपने सेगफॉल्ट को पुन: पेश कर सकता हूं।

  • अगर मैं पिप का उपयोग कर एक virtualenv में numpy 1.8.2 स्थापित (अभी भी उबंटू रेपोस से जनहित याचिका v1.7.1 का प्रयोग करके) तो मैं अब segfault देखते हैं।

  • यदि मैं विपरीत करता हूं (पीआईएल v1.1.7 को पाइप का उपयोग करके स्थापित करता हूं, और उबंटू रेपो से numpy v1.8.2 का उपयोग करके), मुझे अभी भी segfault मिलता है।

इससे मुझे विश्वास होता है कि यह खराब में एक पुरानी बग के कारण होता है। मैं numpy के मुद्दे ट्रैकर में एक अच्छा उम्मीदवार नहीं ढूंढ पाया है, लेकिन मुझे संदेह है कि numpy अद्यतन (उदा। वर्तमान स्रोत से या पीआईपी के माध्यम से) शायद इस मुद्दे को हल करेगा।

एक वैकल्पिक हल सरणी बनाने, तो बूलियन के लिए इसे वापस परिवर्तित करने से पहले "P" (अहस्ताक्षरित 8 बिट ints) करने के लिए छवि मोड परिवर्तित करने के लिए है:

arr2 = np.asarray(img.convert("P")).astype(np.bool) 
v = arr2[1:800,1:100].sum(axis=0) 
+0

पुष्टि - धन्यवाद – Raffael

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

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