मैं यह पता लगाने की कोशिश कर रहा हूं कि PHP को स्मृति के लिए सरणी कैसे लोड करती है और जब कोई सरणी गुजरती है तो स्मृति का उपभोग करता है।PHP की सरणी मेमोरी उपयोग प्रबंधन कैसे काम करता है?
तो मैं कोड चल रहा है का यह छोटा सा मिल गया है: ध्यान दें कि इनपुट सरणी इस उदाहरण में कम महत्वपूर्ण है:
<?php
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
echo $this->getMemoryUsage();
यह स्मृति का बिल्कुल 250 KB की खपत, इसका मतलब है सरणी लगभग 250 है आकार में केबी, लगभग।
तो मैं निम्नलिखित कोड भाग गया: मैं क्या पढ़ा के अनुसार
<?php
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
$arr[0]['id'] = 'changing this value';
$foo = $arr;
$foo[2]['id'] = 'changing this value again';
$bar = $foo;
$bar[4]['id'] = 'changing this value again and again';
$far = $bar;
$far[5]['id'] = 'changing this value again and again and again';
echo $this->getMemoryUsage();
और बताया गया था, पीएचपी वास्तव में सरणी नकल नहीं है, यह केवल मूल सरणी, लेकिन का संदर्भ एक बार एक परिवर्तन है बनाया PHP को पूरे सरणी की प्रतिलिपि बनाना है।
मेरे आश्चर्य की कल्पना करें जब उपरोक्त कोड वास्तव में 500 केबी रैम का उपभोग करता है।
क्या कोई यह बता सकता है कि यहां क्या हो रहा है?
बस स्पष्ट होने के लिए, इन सभी इंडेक्स (0-5 और id
) मूल सरणी में पहले से मौजूद हैं, मैं केवल मूल्य को संशोधित कर रहा हूं। मूल मान कुछ पूर्णांक है।
संपादित
बस $ इस- की भागीदारी स्पष्ट करने के लिए> परिणाम(); यहाँ एक और परीक्षण मैं आयोजित है या नहीं:
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
//$arr[0]['id'] = 'changing this value';
$foo = $arr;
$foo[2]['id'] = 'changing this value again';
//$bar = $foo;
//$bar[4]['id'] = 'changing this value again and again';
//
//$far = $bar;
//$far[4]['id'] = 'changing this value again and again and again';
echo $this->getMemoryUsage();
इस बार उत्पादन बिल्कुल 250 KB है - बस किसी भी परिवर्तन
संपादित करें # 2
के रूप में अनुरोध किया है, मैं बिना मूल परीक्षण की तरह बनाने के लिए मेरी सेटअप पर यहां से कोड दौड़ा लिया है, यकीन है कि परिणाम संगत कर रहे हैं: http://pastebin.com/cYNg4cg7
इन परिणामों हैं:
+०१२३५१६४१०६१घोषणा: 4608 kB
अंतिम: 8904 kB
घोषणा करने के लिए DIFF: 4296 kB
तो भले ही घोषणा 4608 था और सरणी पारित कर दिया और 4 बार बदल दिया गया था, यह अभी भी केवल कम से कम स्मृति दोगुनी है पदचिह्न।
संपादित # 3
मैं प्रत्येक आवंटन के बाद स्मृति परिवर्तन भाग गया है:
घोषणा: 5144 kB
A0 आवंटन कहा: 144 kB
A1 आवंटन जोड़ा: 1768 kB
आवंटित ए 2 जोड़ा गया: 1768 केबी
आवंटित ए 3 जोड़ा गया: 1768 केबी
अंतिम: 10744 केबी
डीआईएफएफ से निपटने के लिए: 5600 केबी
पहली लागत के बाद प्रत्येक निम्नलिखित ऑपरेशन बिल्कुल वही है, जो संकेत मिलता है कि सटीक उसी आकार की प्रतिलिपि बनाई जा रही है। ऐसा लगता है कि ऑस्टिन के जवाब का समर्थन करता है, केवल एक चीज जो अब जोड़ती नहीं है वह आवंटित आकार है, लेकिन यह एक अलग सवाल है।
ऑस्टिन की गेंद पर लगता है, अगर कोई अन्य जवाब नहीं आता है तो मैं इसे स्वीकार करूंगा।
बहुत कठिन प्रश्न है, तो आप निम्न आलेख में रुचि मैं कुछ दिन पहले पढ़ा हो सकता है: https: // nikic .github.io/2011/12/12/कैसे-बड़े-PHP-arrays-really-hint-BIG.html – Fleshgrinder
मैंने कुछ हफ्ते पहले उस लेख को पढ़ लिया है, यह ईमानदारी से fasci है nating, लेकिन यह समझा नहीं है कि प्रतिलिपि कैसे काम करता है। – Patrick
मुझे पता है, बस सोचा था कि आपको यह पसंद आएगा। मैं आपके प्रश्न का उत्तर नहीं दे सकता और मैं आपको एक लिंक नहीं दे सकता जो आपके प्रश्न का उत्तर दे। इसके बजाए मैंने आपके प्रश्न का अभिनय किया ताकि मैं इसका अनुसरण कर सकूं और अगर कोई उत्तर पोस्ट नहीं किया जाता है, तो मुझे यह बक्षीस मिलेगा, क्योंकि मुझे यह भी जानना अच्छा लगेगा। :) – Fleshgrinder