কোনও ভেরিয়েবলের মেমরির পদচিহ্ন (আকার) কীভাবে নির্ধারণ করবেন?


102

প্রদত্ত ভেরিয়েবল কত মেমরি ব্যবহার করে তা খুঁজে পাওয়ার জন্য পিএইচপি (বা কোনও পিএইচপি এক্সটেনশান) আছে কি? sizeofশুধু আমাকে উপাদান / বৈশিষ্ট্য সংখ্যা বলুন।

memory_get_usageএটি আমাকে পুরো স্ক্রিপ্ট দ্বারা ব্যবহৃত মেমরির আকার দেয় এটিতে সহায়তা করে । একটি একক ভেরিয়েবলের জন্য এটি করার কোনও উপায় আছে কি?

মনে রাখবেন যে এটি একটি ডেভলপমেন্ট মেশিনে রয়েছে, সুতরাং এক্সটেনশানগুলি বা ডিবাগ সরঞ্জামগুলি লোড করা সম্ভব।


সম্পাদিত - এটি 5 বছর পরে, এবং কিছু সমস্যা এখনও কিছুটা অমীমাংসিত রয়েছে :(
পিসকভর

উত্তর:


46

আপনার সম্ভবত একটি মেমরি প্রোফাইলার প্রয়োজন। আমি এসও থেকে তথ্য সংগ্রহ করেছি তবে আমি কয়েকটি গুরুত্বপূর্ণ জিনিস অনুলিপি করেছি যা আপনাকে সহায়তা করতে পারে।

আপনি সম্ভবত জানেন যে এক্সডিবাগ ২. * সংস্করণ থেকে মেমরির প্রোফাইলিং সমর্থনটি বাদ দিয়েছেন। দয়া করে এখানে "সরানো ফাংশন" স্ট্রিংটি অনুসন্ধান করুন: http://www.xdebug.org/updates.php

সরানো ফাংশন

মেমোরি প্রোফাইলিংয়ের জন্য সমর্থন সরিয়ে দেওয়া হয়েছে কারণ এটি সঠিকভাবে কাজ করে না।

অন্যান্য প্রোফাইলার বিকল্প

পিএইচপি-মেমরি প্রোফাইলার

https://github.com/arnaud-lb/php-memory-profiler । এটি সক্ষম করতে আমি আমার উবুন্টু সার্ভারে এটি করেছি:

sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof
echo "extension=memprof.so" > /etc/php5/mods-available/memprof.ini
sudo php5enmod memprof
service apache2 restart

এবং তারপরে আমার কোডে:

<?php
memprof_enable();
// do your stuff
memprof_dump_callgrind(fopen("/tmp/callgrind.out", "w"));

শেষ পর্যন্ত কে- কেগ্রিগ্রিন্ড দিয়ে callgrind.outফাইলটি খুলুন

গুগল gperftools ব্যবহার (প্রস্তাবিত!)

প্রথমে এখানে সর্বশেষতম প্যাকেজটি ডাউনলোড করে গুগল জিপারফটুলগুলি ইনস্টল করুন: https://code.google.com/p/gperftools/

তারপরে সর্বদা হিসাবে:

sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install

এখন আপনার কোডে:

memprof_enable();

// do your magic

memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));

তারপরে আপনার টার্মিনালটি খুলুন এবং চালু করুন:

pprof --web /tmp/profile.heap

নীচে দেখানো জাতীয় কিছু সহ আপনার বিদ্যমান ব্রাউজার সেশনে পিআরএফ একটি নতুন উইন্ডো তৈরি করবে:

মেমপ্রোফ এবং গ্যাপারফটুলগুলি সহ পিএইচপি মেমরি প্রোফাইলিং

এক্সএইচপ্রুফ + এক্সহগুই (সিপিইউ এবং মেমরি উভয়ই প্রোফাইলে আমার মতে সেরা)

সঙ্গে Xhprof এবং Xhgui ভাল হিসাবে আপনি বা শুধু মেমোরি ব্যবহার CPU ব্যবহারের প্রোফাইলে করতে পারেন যে মুহূর্তে আপনার সমস্যা রয়েছে। এটি একটি সম্পূর্ণ সমাধান, এটি আপনাকে সম্পূর্ণ নিয়ন্ত্রণ দেয় এবং লগগুলি মঙ্গো বা ফাইল সিস্টেমে উভয়ই লেখা যায়।

আরও তথ্যের জন্য এখানে দেখুন

কালো আগুন

ব্ল্যাকফায়ার হলেন সেন্সিওল্যাবস, পিএইচপি প্রোফাইলার, সিমফনি 2 ছেলেরা https://blackfire.io/

আপনি যদি আপনার ভার্চুয়াল মেশিন সেট আপ করতে পুপ্পেট ব্যবহার করেন তবে আপনি এটি সমর্থিত তা জানতে পেরে খুশি হবেন ;-)

এক্সডিবাগ এবং ট্রেসিং মেমরির ব্যবহার

এক্সডিবিউজি 2 পিএইচপি- জন্য একটি এক্সটেনশন। এক্সডিবাগ আপনাকে সমস্ত ফাংশন কলগুলি লগ করতে দেয়, প্যারামিটার সহ এবং বিভিন্ন ফর্ম্যাটে কোনও ফাইলে মান ফেরত দেয় three তিনটি আউটপুট ফর্ম্যাট রয়েছে। একটি হ'ল একটি মানব পাঠযোগ্য ট্রেস হিসাবে বোঝানো হয়েছে, কম্পিউটার প্রোগ্রামগুলির জন্য আরও একটি উপযুক্ত কারণ এটি পার্স করা সহজ, এবং শেষটি ট্রেস ফর্ম্যাট করার জন্য এইচটিএমএল ব্যবহার করে। আপনি সেটিংস সহ দুটি পৃথক বিন্যাসের মধ্যে স্যুইচ করতে পারেন। একটি উদাহরণ এখানে পাওয়া যাবে

forp

ফর্ম সরল, অ-অনুপ্রবেশকারী, উত্পাদনমুখী , পিএইচপি প্রোফাইলার। বৈশিষ্ট্যগুলির কয়েকটি হ'ল:

  • প্রতিটি ফাংশনের জন্য সময়ের পরিমাপ এবং বরাদ্দ মেমরি

  • CPU 'র ব্যবহার

  • ফাংশন কল ফাইল এবং লাইন নম্বর

  • গুগলের ট্রেস ইভেন্ট ফর্ম্যাট হিসাবে আউটপুট

  • ফাংশন ক্যাপশন

  • ফাংশন গ্রুপিং

  • ফাংশনগুলির উপকরণ (বেনাম ফাংশনগুলির জন্য দরকারী)

DBG

ডিবিজি হ'ল একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত পিএইচপি ডিবাগার, একটি ইন্টারেক্টিভ সরঞ্জাম যা আপনাকে পিএইচপি স্ক্রিপ্টগুলি ডিবাগ করতে সহায়তা করে। এটি একটি প্রোডাকশন এবং / বা ডেভলপমেন্ট ওয়েবে সার্ভারে কাজ করে এবং আপনাকে আইডিই বা কনসোল থেকে আপনার স্ক্রিপ্টগুলি স্থানীয়ভাবে বা দূর থেকে ডিবাগ করতে দেয় এবং এর বৈশিষ্ট্যগুলি হ'ল:

  • রিমোট এবং স্থানীয় ডিবাগিং

  • সুস্পষ্ট এবং অন্তর্নিহিত অ্যাক্টিভেশন

  • তাদের পরামিতিগুলির সাথে ফাংশন কল, গতিশীল এবং স্ট্যাটিক পদ্ধতি কলগুলি সহ কল ​​স্ট্যাক

  • সংশ্লিষ্ট (নেস্টেড) স্থানে ভেরিয়েবলগুলি মূল্যায়ন করার ক্ষমতা সহ কল ​​স্ট্যাকের মাধ্যমে নেভিগেশন

  • স্টেপ ইন / স্টেপ আউট / স্টেপ ওভার / কার্সার কার্যকারিতা থেকে চালান

  • শর্তাধীন ব্রেকপয়েন্টস oints

  • গ্লোবাল ব্রেকপয়েন্টস

  • ত্রুটি এবং সতর্কতার জন্য লগ ইন করা

  • সমান্তরাল ডিবাগিংয়ের জন্য একসাথে একাধিক সেশন

  • জিইউআই এবং সিএলআই সামনের দিকের জন্য সমর্থন

  • IPv6 এবং IPv4 নেটওয়ার্ক সমর্থিত

  • ডিবাগার দ্বারা স্থানান্তরিত সমস্ত ডেটা allyচ্ছিকভাবে এসএসএল দ্বারা সুরক্ষিত হতে পারে


2
আমি ঠিক সেই তথ্যটিই খুঁজছিলাম, আপনাকে ধন্যবাদ।
পিসকভোর

93

একক ভেরিয়েবলের মেমরির ব্যবহারের সরাসরি কোনও উপায় নেই, তবে গর্ডনের পরামর্শ অনুসারে আপনি ব্যবহার করতে পারেন memory_get_usage। এটি বরাদ্দকৃত মোট পরিমাণের পরিমাণ ফিরিয়ে দেবে, যাতে আপনি একটি একক ভেরিয়েবলের ব্যবহার পাওয়ার আগে এবং পরে একটি পরিশ্রম ব্যবহার করতে পারেন এবং ব্যবহার পরিমাপ করতে পারেন। এটি কিছুটা হ্যাকি তবে এটি কাজ করা উচিত।

$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;

দ্রষ্টব্য যে এটি কোনওভাবেই নির্ভরযোগ্য পদ্ধতি নয়, আপনি নিশ্চিত হতে পারবেন না যে ভেরিয়েবলটি নির্ধারণের সময় অন্য কোনও কিছুই মেমরির স্পর্শ করে না, সুতরাং এটি কেবল একটি আনুমানিক হিসাবে ব্যবহার করা উচিত।

ফাংশনের অভ্যন্তরে ভেরিয়েবলের অনুলিপি তৈরি করে এবং ব্যবহৃত স্মৃতি মাপার মাধ্যমে আপনি এটি কোনও ফাংশনে পরিণত করতে পারেন। এটি পরীক্ষা করা হয়নি, তবে নীতিগতভাবে, আমি এটিতে কোনও ভুল দেখছি না:

function sizeofvar($var) {
    $start_memory = memory_get_usage();
    $tmp = unserialize(serialize($var));
    return memory_get_usage() - $start_memory;
}

14
$tmp = $varঅগভীর অনুলিপি তৈরি করবে। Mp tmp সংশোধন না করা পর্যন্ত এটি আরও মেমরি বরাদ্দ করবে না।
গর্ডন

@ গর্ডন, আপনি ঠিক বলেছেন, আমি বিন্দুটিকে এড়িয়ে গেছি। যেহেতু আমি ভেরিয়েবলের ধরণ বা আকার পরিবর্তন না করে পরিবর্তন করার কোনও সঠিক উপায় বের করতে পারি না, তাই আমি তা ছেড়ে দেব। সম্ভবত কেউ সঠিক ধারণা নিয়ে আসতে পারেন :)
তাতু উলমানেন

7
কিভাবে সম্পর্কে $tmp = unserialize(serialize($var)); এটি উপরে আইস্টিনার পদ্ধতির সমন্বয় করবে।
গর্ডন

3
এছাড়াও, যেহেতু $varইতিমধ্যে একটি অগভীর অনুলিপি বা ফাংশনটিতে কী পাস হয়েছে তার রেফারেন্স, আপনার প্রয়োজন নেই $tmp, তবে আবার সাইন ইন করতে পারেন $var। এই থেকে অভ্যন্তরীণ রেফারেন্স সংরক্ষণ $tmpকরতে $var
গর্ডন

এর $tmpথেকে আরও বেশি মার্জিত উপায় নেই $var?
টম্যা জ্যাটো - মনিকা

24

কোন নেই. তবে আপনি আনুমানিক ফলাফলের জন্য ফলাফলটি serialize($var)পরীক্ষা করতে পারেন strlen


এটি একটি আরও ভাল পদ্ধতির, যেহেতু এটি পুরো জিসি জিনিস এড়িয়ে চলে।
গ্লেনো

12
এটি একটি ভয়াবহ অনুমান। পিএইচপি একটি অ্যারের মধ্যে প্রতিটি আইটেম ~ 80 বাইট, এখনো strlen(serialize(array(1,2,3)))30. হয়
gsnedders

2
@ আস্তিনা, -১। আপনি ভুল জিনিস পরিমাপ করছেন। ভেরিয়েবল এবং সিরিয়ালযুক্ত ভেরিয়েবল দুটি সম্পূর্ণ ভিন্ন জিনিস এবং সম্পূর্ণ ভিন্ন ফলাফল দেয় give
পেসারিয়ার

1
কেবল তা-ই নয়, তবে এটি নির্দিষ্ট কিছু অ-সিরিয়ালাইজযোগ্য ডেটা স্ট্রাকচারগুলিতে সম্পূর্ণরূপে ব্যর্থ হবে , উদাহরণস্বরূপ বিজ্ঞপ্তি রেফারেন্স।
সন্ধ্যাশক্তি-নিষ্ক্রিয়-

20

তাতু উলমানেন্সের উত্তরে:

এটি লক্ষ করা উচিত, এটি $start_memoryনিজেই স্মৃতি গ্রহণ করবে ( PHP_INT_SIZE * 8)।

সুতরাং পুরো ফাংশনটি হওয়া উচিত:

function sizeofvar($var) {
    $start_memory = memory_get_usage();
    $var = unserialize(serialize($var));
    return memory_get_usage() - $start_memory - PHP_INT_SIZE * 8;
}

এটি অতিরিক্ত উত্তর হিসাবে যুক্ত করার জন্য দুঃখিত, তবে আমি এখনও কোনও উত্তরের বিষয়ে মন্তব্য করতে পারি না।

আপডেট: * 8 নির্দিষ্ট নয়। এটি সম্ভবত পিএইচপি সংস্করণ এবং সম্ভবত /৪//২ বিটের উপর নির্ভর করতে পারে।


4
কেন আপনি ব্যাখ্যা করতে পারেন * 8? ধন্যবাদ!
সিয়েরসডেটান্ডিল

@ সিয়েরাসডেট্যান্ডিল এটি দেখে মনে হয় যে $ সূচনা_মেমরিটি কেবল PHP_INT_SIZEবাইটস গ্রহণ করে না , তবে PHP_INT_SIZE*8। আপনি এই ফাংশনটি কল করে চেষ্টা করতে পারেন, এটি 0:function sizeofvar() { $start_memory = memory_get_usage(); return memory_get_usage() - $start_memory - PHP_INT_SIZE*8; }
প্যারা

8ধ্রুব মনে হয় না। আমার ডেভ সিস্টেমে আপনার মন্তব্য ফাংশন অনুসরণ করে (পিএইচপি 5.6.19), এটি ফিরে আসে -16। এছাড়াও, আকর্ষণীয়ভাবে, থেকে php -a, ফাংশনটির দুটি লাইনে কল করা বিভিন্ন বিভিন্ন মান দেয়।
পল ডিলার

@ পলডেল হ্যাঁ, সম্ভবত এটি এই ধরণের স্টাফ বা সংস্করণ / bit৪ বিটের উপর নির্ভরশীল।
প্যারা

আনসিরিয়াল () কলটিতে মারাত্মক ত্রুটি ঘটে। এটা কোন সাহায্য! যদি কোনও ভেরিয়েবল এত বড় হয় তবে এটি মেমরির বাইরে চলে যায়, সেই ভেরিয়েবলের কোনও ফাংশন কল করা আরও বেশি স্মৃতি ব্যবহার করবে use :(
জন ktejik

4

দেখা:

  • memory_get_usage() - পিএইচপি-তে বরাদ্দ করা মেমরির পরিমাণ ফেরত দেয়
  • memory_get_peak_usage() - পিএইচপি দ্বারা বরাদ্দ মেমরির শিখর ফিরিয়ে দেয়

নোট করুন যে এটি আপনাকে নির্দিষ্ট ভেরিয়েবলের মেমরির ব্যবহার দেয় না। তবে আপনি ভেরিয়েবল নির্ধারণের আগে এবং পরে এই ফাংশনে কল রাখতে পারেন এবং তারপরে মানগুলি তুলনা করতে পারেন। এটি আপনাকে ব্যবহৃত মেমরির ধারণা দেয়।

আপনি পিইসিএল এক্সটেনশন মেমট্র্যাকের দিকেও নজর রাখতে পারেন , যদিও ডকুমেন্টেশনটিতে কিছুটা অভাব রয়েছে, যদি না বলতে হয়, কার্যত অস্তিত্বহীন।


হ্যাঁ. প্রশ্নের উত্তর দেওয়ার জন্য এটি অপ্রত্যক্ষভাবে ব্যবহার করা যেতে পারে।
নোটলিস্ট

3

আপনি একটি কলব্যাক রিটার্ন মানটিতে মেমরির পার্থক্য গণনা করতে বেছে নিতে পারেন। এটি পিএইচপি 5.3+ এ আরও মার্জিত সমাধান উপলভ্য।

function calculateFootprint($callback) {
    $startMemory = memory_get_usage();
    $result = call_user_func($callback);
    return memory_get_usage() - $startMemory;
}

$memoryFootprint = calculateFootprint(
    function() {
        return range(1, 1000000);
    }
);

echo ($memoryFootprint / (1024 * 1024)) . ' MB' . PHP_EOL;

3

দুটি ভেরিয়েবল মেমরিতে একই বরাদ্দকৃত স্থানটি ভাগ করতে পারে বলে আপনি কোনও ভেরিয়েবলের সঠিক পদচিহ্নটি পুনঃপ্রণোদিতভাবে গণনা করতে পারবেন না

আসুন দুটি অ্যারের মধ্যে মেমরি ভাগ করে নেওয়ার চেষ্টা করি, আমরা দেখতে পাচ্ছি যে দ্বিতীয় অ্যারেটি বরাদ্দ করতে প্রথমটির মেমরির অর্ধেক ব্যয় হয়। যখন আমরা প্রথমটি আনসেট করি, তখন প্রায় সমস্ত স্মৃতি দ্বিতীয় দ্বারা ব্যবহৃত হয়।

echo memory_get_usage()."\n"; // <-- 433200
$c=range(1,100);
echo memory_get_usage()."\n"; // <-- 444348 (+11148)
$d=array_slice($c, 1);
echo memory_get_usage()."\n"; // <-- 451040 (+6692)
unset($c);
echo memory_get_usage()."\n"; // <-- 444232 (-6808)
unset($d);
echo memory_get_usage()."\n"; // <-- 433200 (-11032)

সুতরাং আমরা দ্বিতীয় অ্যারের অর্ধেক স্মৃতি ব্যবহার করার চেয়ে সিদ্ধান্তে পৌঁছাতে পারি না, কারণ এটি প্রথমটি আনসেট করার সময় এটি মিথ্যা হয়ে যায়।

পিএইচপি-তে কীভাবে মেমরি বরাদ্দ করা হয় এবং কোন ব্যবহারের জন্য, সে সম্পর্কে একটি সম্পূর্ণ দেখার জন্য আমি আপনাকে নীচের নিবন্ধটি পড়ার পরামর্শ দিই: পিএইচপি অ্যারেগুলি (এবং মানগুলি) আসলে কত বড়? (ইঙ্গিত: বড়!)

রেফারেন্স কাউন্টিং বুনিয়াদি পিএইচপি ডকুমেন্টেশন এছাড়াও মেমরি ব্যবহার সম্পর্কে তথ্য অনেক আছে, এবং রেফারেন্স ভাগ করা ডেটা সেগমেন্ট পর্যন্ত গুনতে থাকো।

এখানে প্রকাশিত বিভিন্ন সমাধান আনুমানিকতার জন্য ভাল তবে পিএইচপি মেমরির সূক্ষ্ম পরিচালনা পরিচালনা করতে পারে না কেউ।

  1. সদ্য বরাদ্দ স্থান গণনা করা

যদি আপনি কোনও অ্যাসাইনমেন্টের পরে সদ্য বরাদ্দকৃত স্থানটি চান, তবে আপনাকে memory_get_usage()বরাদ্দের আগে এবং পরে ব্যবহার করতে হবে, কারণ অনুলিপি সহ এটি ব্যবহার করা আপনাকে বাস্তবতার একটি ভ্রান্ত দৃষ্টিভঙ্গি দেয়।

// open output buffer
echo "Result: ";
// call every function once
range(1,1); memory_get_usage();

echo memory_get_usage()."\n";
$c=range(1,100);
echo memory_get_usage()."\n";

মনে রাখবেন যে আপনি যদি প্রথমটির ফলাফল সংরক্ষণ করতে চান memory_get_usage()তবে ভেরিয়েবলটি ইতিমধ্যে উপস্থিত থাকতে হবে এবংmemory_get_usage() হবে এবং আগের বারটিকে এবং অন্য প্রতিটি ফাংশনও ডাকতে হবে।

আপনি যদি উপরের উদাহরণটির মতো প্রতিধ্বনি করতে চান তবে আউটপুট বাফারটি খোলার জন্য অ্যাকাউন্টিং মেমরিটি এড়াতে আপনার আউটপুট বাফারটি ইতিমধ্যে খোলা থাকতে হবে।

  1. প্রয়োজনীয় স্থান গণনা করা

আপনি যদি কোনও ভেরিয়েবলের অনুলিপি সঞ্চয় করতে প্রয়োজনীয় স্থান গণনা করতে কোনও ফাংশনের উপর নির্ভর করতে চান তবে নিম্নলিখিত কোডটি বিভিন্ন অপ্টিমাইজেশনের যত্ন নেয়:

<?php
function getMemorySize($value) {
    // existing variable with integer value so that the next line
    // does not add memory consumption when initiating $start variable
    $start=1;
    $start=memory_get_usage();
    // json functions return less bytes consumptions than serialize
    $tmp=json_decode(json_encode($value));
    return memory_get_usage() - $start;
}

// open the output buffer, and calls the function one first time
echo ".\n";
getMemorySize(NULL);

// test inside a function in order to not care about memory used
// by the addition of the variable name to the $_GLOBAL array
function test() {
    // call the function name once 
    range(1,1);

    // we will compare the two values (see comment above about initialization of $start)
    $start=1;
    $start=memory_get_usage();
    $c=range(1,100);
    echo memory_get_usage()-$start."\n";
    echo getMemorySize($c)."\n";
}
test();

// same result, this works fine.
// 11044
// 11044

নোট করুন যে বরাদ্দ করা মেমরিটিতে ভেরিয়েবল নামের আকারটি গুরুত্বপূর্ণ।

  1. আপনার কোড চেক করুন !!

একটি পরিবর্তনশীল পিএইচপি উত্স কোড ব্যবহৃত অভ্যন্তরীণ সি কাঠামো দ্বারা সংজ্ঞায়িত একটি বেসিক আকার আছে। সংখ্যার ক্ষেত্রে এই আকারটি ওঠানামা করে না। স্ট্রিংগুলির জন্য, এটি স্ট্রিংয়ের দৈর্ঘ্য যুক্ত করবে।

typedef union _zvalue_value {
    long lval;                  /* long value */
    double dval;                /* double value */
    struct {
        char *val;
        int len;
    } str;
    HashTable *ht;              /* hash table value */
    zend_object_value obj;
} zvalue_value;

যদি আমরা ভেরিয়েবলের নামের সূচনাটি অ্যাকাউন্টে না নিই তবে আমরা ইতিমধ্যে জানি যে একটি ভেরিয়েবল কতগুলি ব্যবহার করে (সংখ্যা এবং স্ট্রিংয়ের ক্ষেত্রে):

সংখ্যার ক্ষেত্রে 44 বাইট

স্ট্রিংয়ের ক্ষেত্রে 24 বাইট

স্ট্রিংয়ের দৈর্ঘ্য (চূড়ান্ত NUL অক্ষর সহ)

(এই সংখ্যাগুলি পিএইচপি সংস্করণের উপর নির্ভর করে পরিবর্তন করতে পারে)

মেমরি অ্যালাইনমেন্টের কারণে আপনাকে 4 বাইটের একাধিক পর্যন্ত গোল করতে হবে। চলকটি যদি বিশ্বব্যাপী স্পেসে থাকে (কোনও ফাংশনের অভ্যন্তরে নয়) তবে এটি আরও 64 বাইট বরাদ্দ করবে।

সুতরাং আপনি যদি এই পৃষ্ঠার অভ্যন্তরে কোডগুলির মধ্যে একটি ব্যবহার করতে চান তবে আপনাকে পরীক্ষা করতে হবে যে কিছু সাধারণ পরীক্ষার কেস (স্ট্রিং বা সংখ্যা) ব্যবহার করে ফলাফলটি এই পোস্টের প্রতিটি ইঙ্গিতকে বিবেচনা করে সেই তথ্যগুলির সাথে মেলে (G _গ্লোবাল অ্যারে, প্রথম ফাংশন কল, আউটপুট বাফার, ...)


1
... এবং এটি আমাদের অভ্যন্তরীণ প্রবেশের আগে zvalue, is_refএবং অনুলিপি-লেখার আগেই । ধন্যবাদ.
পিসকভোর

1
আপনাকে ধন্যবাদ, আমি পিএইচপি ম্যানুয়ালটিতে সেই পৃষ্ঠাটি মিস করেছি। আমার উত্তরটি সম্পূর্ণ করার জন্য আমি লিঙ্কটি যুক্ত করেছি (তবে আমার ধারণা আপনি ইতিমধ্যে এটি পড়েছিলেন)।
আদম

2

আমারও অনুরূপ সমস্যা ছিল এবং আমি যে সমাধানটি ব্যবহার করি তা হ'ল কোনও ফাইলের ক্ষেত্রে ভেরিয়েবল লিখুন এবং তারপরে ফাইলসাইজ () চালান। মোটামুটি এটির মতো (অনির্ধারিত কোড):

function getVariableSize ( $foo ) 
{
    $tmpfile = "temp-" . microtime(true) . ".txt";
    file_put_contents($tmpfile, $foo);
    $size = filesize($tmpfile);
    unlink($tmpfile);
    return $size;
}

এই সমাধানটি ভয়াবহভাবে দ্রুত নয় কারণ এতে ডিস্ক আইও অন্তর্ভুক্ত রয়েছে তবে এটি আপনাকে মেমোরি_সেট_ব্যবহার কৌশলগুলির চেয়ে অনেক বেশি সঠিক কিছু দেবে। এটি ঠিক কতটা নির্ভুলতার প্রয়োজন তার উপর নির্ভর করে।


এটি দ্রষ্টব্য হওয়া উচিত যে এই সমাধানটি কেবল স্ট্রিং এবং একক মাত্রার স্ট্রিংগুলির জন্য কাজ করে এবং এটি ব্যবহার strlenকরা আরও সহজ।
আদম


1
function mesure($var){
    $start = memory_get_usage();
    if(is_string($var)){
        $newValue = $var . '';
    }elseif(is_numeric($var)){
        $newValue = $var + 0;
    }elseif(is_object($var)){
        $newValue = clone $var;
    }elseif(is_array($var)){
        $newValue = array_flip($var, []);
    }
    return memory_get_usage() - $start;
}

1

নিম্নলিখিত স্ক্রিপ্টটি একটি একক ভেরিয়েবলের মোট মেমরির ব্যবহার দেখায়।

function getVariableUsage($var) {
  $total_memory = memory_get_usage();
  $tmp = unserialize(serialize($var));
  return memory_get_usage() - $total_memory; 
}

$var = "Hey, what's you doing?";
echo getVariableUsage($var);

এটা দেখ

http://www.phpzag.com/how-much-memory-do-php-variables-use/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.