2009-07-02 26 views
27

PHP में किसी ऑब्जेक्ट द्वारा उपयोग की जाने वाली मेमोरी को कैसे ढूंढें? (सी का आकार)। जिस वस्तु को मैं खोजना चाहता हूं वह स्ट्रिंग्स और इंट्स के साथ एक शब्दकोश है, जिससे इसे मैन्युअल रूप से गणना करना मुश्किल हो जाता है। एन्कोडिंग (utf8 आदि) के आधार पर PHP में स्ट्रिंग भी विभिन्न लंबाई का हो सकता है?PHP में किसी ऑब्जेक्ट द्वारा उपयोग की जाने वाली मेमोरी को कैसे ढूंढें? (आकार)

उत्तर

40

आप memory_get_usage() का उपयोग कर सकते हैं।

अपनी ऑब्जेक्ट बनाने से पहले इसे फिर से चलाएं, फिर अपनी ऑब्जेक्ट बनाने के बाद, और दो परिणामों के बीच अंतर लें।

+2

मेमोरी के दौरान इसे करने का एक और तरीका है स्मृति उपयोग प्राप्त करें, ऑब्जेक्ट क्लोन करें, नया मेमोरी उपयोग प्राप्त करें और क्लोन को अनसेट करें। हालांकि एक पदचिह्न है, इसलिए दुरुपयोग न करें ... :) –

+0

मुझे विश्वास है कि हम एक सरणी से पहले और बाद में 'echo memory_get_usage()' से प्राप्त कर रहे हैं, इसकी इकाइयां 'केबी' में होने का अनुमान है !! ! मैंने स्मृति आकार को 1024 से विभाजित किया! वास्तविक स्मृति आकार का उपभोग करने के लिए। – Neocortex

+2

नहीं यह बाइट्स में नहीं है kb http://ca3.php.net/memory_get_usage –

-6

मुझे नहीं पता कि PHP में किसी ऑब्जेक्ट का आकार प्राप्त करने का एक आसान तरीका है। तुम बस एक algorith करने के लिए हो सकता है

  1. गिनता ints
  2. हार्ड डिस्क पर किसी पूर्णांक
  3. ASCII करने के लिए तार में कन्वर्ट अक्षर और
  4. गुणा ASCII मूल्यों के आकार से ints की
  5. गुणा संख्या डिस्क

मुझे यकीन है कि एक बेहतर तरीका है, लेकिन यह काम करेगा, भले ही यह दर्द हो।

+4

वह पागल था। ;] –

+14

आप इस एक दोस्त को पोस्ट करने के लिए 1 अप्रैल के लिए इंतजार करना भूल गए! – NickT

+0

मुझे नहीं लगता कि वह गंभीर था :) – Stann

10

वस्तुओं आकार के बारे में एक विचार प्राप्त करने के लिए,

strlen(serialize($object)); 

कोशिश नहीं सही तरह से यह है, लेकिन तुलना के लिए एक संख्या प्राप्त करने के लिए एक आसान तरीका।

+1

इसमें कुछ उपयोग हो सकते हैं, लेकिन स्मृति के लिए नहीं। PHP <= 5.2 गहराई से अक्षम है जिस तरह से यह कुछ स्मृति संरचनाओं को संग्रहीत करता है। – danorton

+0

मैं इसे भेजने से पहले जेसन प्रतिक्रिया की जांच करने के लिए इसका उपयोग कर रहा था, लेकिन यह वास्तव में मेरी स्मृति सीमा को समाप्त करता है – clod986

8

यदि आपको पहले से बनाए गए ऑब्जेक्ट या सरणी के आकार को जानने की आवश्यकता है, तो आप इसे ढूंढने के लिए निम्न कोड का उपयोग कर सकते हैं।

<?php 

function rec_copy($src) { 
    if (is_string($src)) { 
    return str_replace('SOME_NEVER_OCCURING_VALUE_145645645734534523', 'XYZ', $src); 
    } 

    if (is_numeric($src)) { 
    return ($src + 0); 
    } 

    if (is_bool($src)) { 
    return ($src?TRUE:FALSE); 
    } 
    if (is_null($src)) { 
    return NULL; 
    } 

    if (is_object($src)) { 
    $new = (object) array(); 
    foreach ($src as $key => $val) { 
     $new->$key = rec_copy($val); 
    } 
    return $new; 
    } 

    if (!is_array($src)) { 
    print_r(gettype($src) . "\n"); 
    return $src; 
    } 

    $new = array(); 

    foreach ($src as $key => $val) { 
    $new[$key] = rec_copy($val); 
    } 
    return $new; 
} 

$old = memory_get_usage(); 
$dummy = rec_copy($src); 
$mem = memory_get_usage(); 

$size = abs($mem - $old); 
?> 

यह अनिवार्य रूप से सरणी संरचना और उसके सदस्यों की सब एक कॉपी बन जाती।

एक 100% सही नहीं है, लेकिन अभी भी काम कर संस्करण भी है:

<?php 

$old = memory_get_usage(); 
$dummy = unserialize(serialize($src)); 
$mem = memory_get_usage(); 

$size = abs($mem - $old); 

आशा है कि ऐसे मामलों में जहां वस्तु पहले से ही निर्माण कर रहा है के लिए मदद करता है।

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

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