2016-02-13 5 views
7

में यह विशाल (गैर-स्पैस) numpy मैट्रिक्स फिट क्यों है numpy.ndarray.nbytes द्वारा रिपोर्ट की गई मुझे बहुत उलझन में है।रैम

मैंने अभी आकार 1 मिलियन (10^6) का एक पहचान मैट्रिक्स बनाया है, जिसके कारण 1 ट्रिलियन पंक्तियां (10^12) हैं। Numpy रिपोर्ट करता है कि यह सरणी 7.28TB है, फिर भी पायथन प्रक्रिया केवल 3.98 जीबी मेमोरी का उपयोग करती है, जैसा कि ओएसएक्स गतिविधि मॉनीटर द्वारा रिपोर्ट किया गया है।

  • क्या संपूर्ण सरणी स्मृति में निहित है?
  • क्या नोम्पी किसी भी तरह से इसके प्रतिनिधित्व को संपीड़ित करता है, या ओएस द्वारा संभाला जाता है?
  • यदि मैं बस y = 2 * x की गणना करता हूं, जो x के समान आकार होना चाहिए, तो प्रक्रिया स्मृति लगभग 30GB तक बढ़ जाती है, जब तक कि यह ओएस द्वारा नहीं मारा जाता। क्यों, और मेमोरी उपयोग के बिना एक्स पर किस प्रकार के ऑपरेशन एक्स का संचालन कर सकते हैं?

इस कोड को मैं प्रयोग किया जाता है:

import numpy as np 
x = np.identity(1e6) 
x.size 
# 1000000000000 
x.nbytes/1024 ** 4 
# 7.275957614183426 
y = 2 * x 
# python console exits and terminal shows: Killed: 9 
+0

विंडोज़ पर न तो 32 बिट और न ही 64 बिट संस्करण ने मुझे इतना बड़ा मैट्रिक्स आवंटित करने की अनुमति दी –

+2

मेरा अनुमान है कि यह [this] (http://stackoverflow.com/q/27574881/1461210) से संबंधित है, हालांकि मैं हूं थोड़ा आश्चर्य है कि यह सिर्फ शून्य के बजाय पहचान matrices के लिए काम करता है। –

+0

@ टामास हेगेडस क्या होगा यदि आप आकार '2e4' का पहचान मैट्रिक्स बनाते हैं? इसे 2.98 जीबी रैम लेना चाहिए। क्या प्रक्रिया इतनी रैम लेती है? – Rems

उत्तर

5

लिनक्स पर (और मैं यह सोचते हैं रहा हूँ एक ही बात मैक के तहत होता है), जब एक कार्यक्रम स्मृति आबंटित करता है, ओएस वास्तव में यह आवंटित नहीं करता है जब तक यह इसका उपयोग नहीं करता है।

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

जब ऐसा होता है, तो ओएस या तो मामूली अन्य प्रक्रियाओं को मारना शुरू कर सकता है और अपनी रैम अनुरोध प्रक्रिया में दे सकता है, या केवल अनुरोध प्रक्रिया को मार सकता है (जो अब हो रहा है)।

पाइथन का प्रारंभिक 4 जीबी मेमोरी संभवतः उन पृष्ठों को है जहां numpy पहचान मैट्रिक्स पर 1 सेट करता है; शेष पृष्ठों का अभी तक उपयोग नहीं किया गया है। जैसे गणित ऑपरेशन करने से ओएस तक स्मृति समाप्त हो जाती है और आपकी प्रक्रिया को मारने तक सभी पृष्ठों तक पहुंच (और इस प्रकार आवंटित) शुरू हो जाती है।

1

सिस्टम स्मृति केवल वर्चुअल आवंटित करता है, केवल पहली बार जब आप इस स्मृति को लिखते हैं, तो यह वास्तव में शारीरिक रूप से उपयोग किया जाता है। आपके उदाहरण के लिए, आप 1 ट्रिलियन नंबर आवंटित करते हैं जो 2 अरब मेमोरी पेजों से मेल खाते हैं, लेकिन इन पृष्ठों के केवल 1 मिलियन (1e6) का उपयोग विकर्ण पर लिखने के लिए किया जाता है। यह वास्तव में 4 जीबी मेमोरी है जो आप देखते हैं।

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