ID: 41053 Updated by: [EMAIL PROTECTED] Reported By: matthieu dot aubry at gmail dot com -Status: Open +Status: Wont fix Bug Type: Performance problem Operating System: linux PHP Version: 5.2.1 New Comment:
>68bytes is indeed pretty close; 57.5e6 / (2*4*1024*1024) ~= 68.54bytes Right. And using PHP 5.2.2RC1 I get ~68Mb, so this is correct. >Do you think it would be possible to improve the memory usage >of such data structures? No, that's not possible, otherwise it would have been done. But you're encourage to help us if you know how to fit a complex struct into very limited space. Previous Comments: ------------------------------------------------------------------------ [2007-04-11 19:03:52] matthieu dot aubry at gmail dot com Tony, I cannot risk to kill my development server yet, but as soon as possible, I'll try the latest PHP CVS. Stats, thank you for your explanations. It is very interesting. Can we find some documentation about the internal implementation of PHP? Specifically about data structures? 68bytes is indeed pretty close; 57.5e6 / (2*4*1024*1024) ~= 68.54bytes Do you think it would be possible to improve the memory usage of such data structures? Also, I don't understand "Memory allocation headers take another 8 bytes*2" : what do you mean by "memory allocation headers"? Thanks. ------------------------------------------------------------------------ [2007-04-11 17:29:05] [EMAIL PROTECTED] Each element requires a value structure (zval) which takes 16 bytes. Also requires a hash bucket - which takes 36 bytes. That gives 52 bytes per value. Memory allocation headers take another 8 bytes*2 - which gives 68 bytes. Pretty close to what you have. ------------------------------------------------------------------------ [2007-04-11 14:12:11] [EMAIL PROTECTED] Please try using this CVS snapshot: http://snaps.php.net/php5.2-latest.tar.gz For Windows: http://snaps.php.net/win32/php5.2-win32-latest.zip ------------------------------------------------------------------------ [2007-04-11 13:26:37] matthieu dot aubry at gmail dot com Description: ------------ Hello, I would like to cache big tables containing integers in PHP memory. But I notice that PHP uses a LOT of memory for variables. I simply fill an array indexed with 1,000,000 distinct integers. I assign 0 to all elements. Results ======= PHP 5.1.2 result is 57.5 MB PHP 5.2.1 result is 99.4 MB Minimum used = 1E6 * (4bytes+4bytes) = 8MB. I don't know much about PHP Array implementation. I don't expect it to use only 8MB of course, but I think it actually uses too much memory. Also, why this difference between the 2 versions? (I've read bug reports stating memory problem in 5.2.0 but they were said to be fixed before 5.2.1) Reproduce code: --------------- <?php function getMemoryUsage() { return round(memory_get_usage() / (1024*1024), 1)." MB"; } function printMemoryUsage() { print("Memory = ".getMemoryUsage()." <br>\n"); } printMemoryUsage(); $end = 1000000; $array = array(); printMemoryUsage(); for($i = 0; $i < $end; $i++) { $array[$i] = 0; } printMemoryUsage(); ?> Expected result: ---------------- Thank you for explanations/details ; is this behaviour expected? Could it be improved in future releases? Actual result: -------------- ================= Test PHP 5.2.1-0.dotdeb.1 with Suhosin-Patch 0.9.6.2 (cli) (built: Feb 9 2007 04:46:32) ================= Linux 2.4.33bipiv-ipv4-32 #1 SMP lun oct 23 18:38:55 CEST 2006 i686 GNU/Linux # time php test27.php Memory = 0.1 MB <br> Memory = 0.1 MB <br> Memory = 99.4 MB <br> real 0m0.954s ================= Test PHP 5.1.2 (cli) (built: Mar 7 2007 21:53:56) ================= Linux 2.6.15-23-386 #1 PREEMPT Tue May 23 13:49:40 UTC 2006 i686 GNU/Linux $ time php test27.php Memory = 0 MB <br> Memory = 0 MB <br> Memory = 57.5 MB <br> real 0m1.520s ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=41053&edit=1