3
\$\begingroup\$

I have a few big arrays stored in separate files that are included into PHP as and when they are required:

Array File:

<?php
 $cty_arr["af"] = "Afghanistan";
 $cty_arr["ax"] = "Åland Islands";
 $cty_arr["al"] = "Albania";
 $cty_arr["dz"] = "Algeria";
 $cty_arr["as"] = "American Samoa";
...
?>

Main Script:

<?php
 require("/var/www/include/array_file.php");
...
?>

I am not very sure how PHP utilizes memory, but I have this thought that some RAM is allocated to store the big array for each instance that the script is run. Since these arrays are static, could there be a better way of loading such arrays to achieve some memory savings?

\$\endgroup\$
2
2
\$\begingroup\$

I thought about this again. My comments are still valid, so including it in a php file is the cheapest way to get the array into your system and without a shared memory you will not reduce the total memory usage.

But maybe you can optimize it at an higher level of abstraction. Assuming that you always only need some countries/settings/localization in your loaded page and never all, you could split this array into multiple files.

<?php
...
function countryCodeToName($key)
{
    if (isset($this->countries[$key])) return $this->countries[$key];
    $firstCharacter=$key[0]
    include "country_".$firstCharacter.".php"; //similar to your file above
    $this->countries=$this->countries + $cty_arr;
    //some handling if still missing 
    //and return ...
}
\$\endgroup\$
5
  • 1
    \$\begingroup\$ +1 ,this is quite an interesting approach.. Let me spend some time to think about it. Thanks :) \$\endgroup\$ – Question Overflow Apr 22 '13 at 14:36
  • 1
    \$\begingroup\$ @QuestionOverflow Please post your benchmark here again. I'm really interested in the results. \$\endgroup\$ – mheinzerling Apr 23 '13 at 5:22
  • 1
    \$\begingroup\$ I have thought over it and finds that this solution is not really practical since there will be some scripts where I would need to echo all the values from the array, then there would be others where a portion of it will be selected at random. I have also did a little benchmark with memory_get_usage() both true and false, to get the memory allocated and used by the script. In one of the scripts, the memory allocated doubles from 262kB to 524kB as soon as the array is loaded although the memory used only increased by 15%. Do you know of any other way to do the benchmark? Thanks. \$\endgroup\$ – Question Overflow Apr 25 '13 at 6:07
  • 1
    \$\begingroup\$ I think for a benchmark memory_get_usage(false) is the better start. You will see even minor changes. But finally the real memory is import and even if you only need one Byte of a new block all the memory will be listed when you call the method with true. \$\endgroup\$ – mheinzerling Apr 25 '13 at 7:55
  • 1
    \$\begingroup\$ So if you don't find a way to use only a part of the values, I think you have do check if you can use a Memcache etc. \$\endgroup\$ – mheinzerling Apr 25 '13 at 7:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.