2009-08-29 16 views
23

कुल स्मृति पीएचपी पाने के लिए एक तरह से (memory_get_usage()) का उपयोग कर रहा है, लेकिन कैसे एक एक व्यक्ति वस्तु की स्मृति में आकार प्राप्त करता है है?PHP में किसी ऑब्जेक्ट की स्मृति में आकार प्राप्त करना?

मैं स्पष्ट रूप से count() के बारे में बात नहीं कर रहा हूँ के रूप में मैं एक संभावित जटिल डेटा संरचना में बाइट की संख्या चाहते हैं।

उत्तर

15

आप से पहले और के रूप में this example from IBM में सचित्र अपनी कक्षा आवंटन के बाद memory_get_usage() कॉल कर सकते हैं। आप इसे करने के लिए एक रैपर भी बना सकते हैं, संभावित रूप से जटिल वर्ग के सदस्य चर पर परिणाम संग्रहित कर सकते हैं।

संपादित करें:

आबंटित स्मृति आकार संग्रहीत करने के बारे हिस्सा स्पष्ट करने के लिए, आप कुछ इस तरह कर सकते हैं:

class MyBigClass 
{ 
    var $allocatedSize; 
    var $allMyOtherStuff; 
} 

function AllocateMyBigClass() 
{ 
    $before = memory_get_usage(); 
    $ret = new MyBigClass; 
    $after = memory_get_usage(); 
    $ret->allocatedSize = ($after - $before); 

    return $ret; 
} 

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

+1

क्या होगा यदि PHP आवंटित की गई स्मृति को मुक्त करने का निर्णय लेता है, बस "गलत समय" पर? मुझे वास्तव में पता नहीं है कि PHP कब स्मृति को मुक्त करता है ("जब आवश्यक हो" की तरह, मुझे लगता है, लेकिन मुझे लगता है कि यह मुक्त करने से कुछ समस्याएं आ सकती हैं? विशेष रूप से कर्कश-संदर्भों के लिए PHP 5.3 द्वारा पेश कचरा कलेक्टर के साथ? –

+0

वैसे हाँ, लेकिन पास्कल के उल्लेख के अलावा, मैं अलग-अलग समय पर इसे अलग-अलग समय में ढूंढने में सक्षम होना चाहता हूं, न केवल आवंटन समय पर। मैं इसे सड़क के नीचे कई लाइनों को ढूंढना चाहता हूं। –

+0

@ पास्कल: PHP स्मृति को मुक्त नहीं करेगा जिसे अभी भी सक्रिय रूप से उपयोग किए जा रहे ऑब्जेक्ट द्वारा संदर्भित किया गया है। चक्रीय संदर्भों का अर्थ है एक संदर्भ बी और बी संदर्भ ए, लेकिन कुछ भी या तो ए या बी संदर्भ नहीं है, इसलिए स्मृति तब तक मुक्त नहीं होगी जब तक कि प्रोग्राम इसे किसी भी तरह से संदर्भित कर सके। –

3

मुझे नहीं लगता कि यह बहुत संभव है; मैंने कभी ऐसा कुछ नहीं देखा है जो आपको स्मृति में ऑब्जेक्ट का आकार प्राप्त करने की अनुमति देगा।

एक सुंदर मोटा विचार पाने का एक समाधान आपके डेटा को क्रमबद्ध करने के लिए हो सकता है, और उस पर स्ट्रेल का उपयोग करें ... लेकिन यह वास्तव में अनुमान का कुछ होगा ... मैं कुछ भी इस तरह पर भरोसा नहीं करता एक चर और refcount में डेटा ouput यह नहीं, बल्कि स्मृति का उपयोग किया: कि, वास्तव में ...


भी debug_zval_dump कि क्या करता है नहीं

$obj = new stdClass(); 
$obj->a = 152; 
$obj->b = 'test'; 

echo '<pre>'; 
debug_zval_dump($obj); 
echo '</pre>'; 

केवल आप मिल जाएगा:

object(stdClass)#1 (2) refcount(2){ 
    ["a"]=> 
    long(152) refcount(1) 
    ["b"]=> 
    string(4) "test" refcount(1) 
} 
+0

बहुत रोचक। मेरा अगला सवाल वास्तव में यह जानने के लिए रिफ्रेंस प्राप्त करने के बारे में था कि स्मृति मेमोरी क्यों है। धन्यवाद! –

11

यह भावना नहीं बनाना चाहेंगे वस्तु serializing और स्ट्रिंग लंबाई पढ़ने की कोशिश करने के लिए? जाहिर है इसे बंद धारावाहिक स्ट्रिंग रों होता क्योंकि कई बाइट्स होगा: 'स्ट्रिंग' इसलिए रों: किया जा रहा अतिरिक्त बाइट्स '... जब तक serialize उसी तरह है कि PHP भंडार वस्तुओं हो सकता है' ???

तो उदाहरण

$size = strlen(serialize($object)); 

बस एक विचार के लिए?

एक और गन्दा लेकिन संभवतः सही सोचा:

एक वर्ग उदाहरण चर के बाद से कई बार चालाकी से किया गया है मान लिया जाये कि इन्स्टेन्शियशन:

$DB; // database access class for eg. 
$mem = memory_get_usage(); 
$DB_tmp = clone $DB; 
$mem = memory_get_usage() - $mem; 
unset($DB_tmp); 

$ मेम स्मृति की सही मात्रा $ डीबी के लिए आवंटित किया जा सकता है ;

function getMemoryUsage($var) { 
    $mem = memory_get_usage(); 
    $tmp = unserialize(serialize($var)); 
    // Return the unserialized memory usage 
    return memory_get_usage() - $mem; 
} 

मैं इसे बेहतर परिणाम की रिपोर्ट है कम से कम, लगता है:

+0

** क्लोन ** मेरे लिए काम नहीं कर रहा है (मुझे नहीं पता क्यों)। ऑब्जेक्ट क्लोन करने के बाद यह हमेशा 100 बाइट्स की रिपोर्ट करता है। –

1

के बाद से क्लोन (Prof83's answer से) मेरे लिए काम नहीं किया, मैं क्रमानुसार और चर जिसका आकार मैं आकलन करना चाहते हैं unserialize करने की कोशिश की मेरे लिए।

+0

आपने '$ tmp' चर का उपयोग नहीं किया था –

0

यदि आप ऑब्जेक्ट का आकार जानना चाहते हैं, और अपने अगले कोड के लिए नहीं, return यह ब्राउज़र पर है, और आप देख सकते हैं कि नेटवर्क ऑब्जेक्ट को कितना प्रेषित करता है।

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