দুটি ভেরিয়েবল মেমরিতে একই বরাদ্দকৃত স্থানটি ভাগ করতে পারে বলে আপনি কোনও ভেরিয়েবলের সঠিক পদচিহ্নটি পুনঃপ্রণোদিতভাবে গণনা করতে পারবেন না
আসুন দুটি অ্যারের মধ্যে মেমরি ভাগ করে নেওয়ার চেষ্টা করি, আমরা দেখতে পাচ্ছি যে দ্বিতীয় অ্যারেটি বরাদ্দ করতে প্রথমটির মেমরির অর্ধেক ব্যয় হয়। যখন আমরা প্রথমটি আনসেট করি, তখন প্রায় সমস্ত স্মৃতি দ্বিতীয় দ্বারা ব্যবহৃত হয়।
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)
সুতরাং আমরা দ্বিতীয় অ্যারের অর্ধেক স্মৃতি ব্যবহার করার চেয়ে সিদ্ধান্তে পৌঁছাতে পারি না, কারণ এটি প্রথমটি আনসেট করার সময় এটি মিথ্যা হয়ে যায়।
পিএইচপি-তে কীভাবে মেমরি বরাদ্দ করা হয় এবং কোন ব্যবহারের জন্য, সে সম্পর্কে একটি সম্পূর্ণ দেখার জন্য আমি আপনাকে নীচের নিবন্ধটি পড়ার পরামর্শ দিই: পিএইচপি অ্যারেগুলি (এবং মানগুলি) আসলে কত বড়? (ইঙ্গিত: বড়!)
রেফারেন্স কাউন্টিং বুনিয়াদি পিএইচপি ডকুমেন্টেশন এছাড়াও মেমরি ব্যবহার সম্পর্কে তথ্য অনেক আছে, এবং রেফারেন্স ভাগ করা ডেটা সেগমেন্ট পর্যন্ত গুনতে থাকো।
এখানে প্রকাশিত বিভিন্ন সমাধান আনুমানিকতার জন্য ভাল তবে পিএইচপি মেমরির সূক্ষ্ম পরিচালনা পরিচালনা করতে পারে না কেউ।
- সদ্য বরাদ্দ স্থান গণনা করা
যদি আপনি কোনও অ্যাসাইনমেন্টের পরে সদ্য বরাদ্দকৃত স্থানটি চান, তবে আপনাকে 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()
হবে এবং আগের বারটিকে এবং অন্য প্রতিটি ফাংশনও ডাকতে হবে।
আপনি যদি উপরের উদাহরণটির মতো প্রতিধ্বনি করতে চান তবে আউটপুট বাফারটি খোলার জন্য অ্যাকাউন্টিং মেমরিটি এড়াতে আপনার আউটপুট বাফারটি ইতিমধ্যে খোলা থাকতে হবে।
- প্রয়োজনীয় স্থান গণনা করা
আপনি যদি কোনও ভেরিয়েবলের অনুলিপি সঞ্চয় করতে প্রয়োজনীয় স্থান গণনা করতে কোনও ফাংশনের উপর নির্ভর করতে চান তবে নিম্নলিখিত কোডটি বিভিন্ন অপ্টিমাইজেশনের যত্ন নেয়:
<?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
নোট করুন যে বরাদ্দ করা মেমরিটিতে ভেরিয়েবল নামের আকারটি গুরুত্বপূর্ণ।
- আপনার কোড চেক করুন !!
একটি পরিবর্তনশীল পিএইচপি উত্স কোড ব্যবহৃত অভ্যন্তরীণ সি কাঠামো দ্বারা সংজ্ঞায়িত একটি বেসিক আকার আছে। সংখ্যার ক্ষেত্রে এই আকারটি ওঠানামা করে না। স্ট্রিংগুলির জন্য, এটি স্ট্রিংয়ের দৈর্ঘ্য যুক্ত করবে।
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 _গ্লোবাল অ্যারে, প্রথম ফাংশন কল, আউটপুট বাফার, ...)