Memory needed for arrays? And major performance problems filling an array

From: Date: Thu, 09 Dec 2004 11:24:56 +0000
Subject: Memory needed for arrays? And major performance problems filling an array
Groups: php.internals 
Request: Send a blank email to internals+get-14034@lists.php.net to get a copy of this message
Hi all, This is my first time posting to these lists, so I apologize if the internals list is wrong. :-) Before I describe my issue, I had been wondering how I can tell/estimate how much memory PHP will use for arrays? Is there at least a rough formula someone can tell me? My environment: 4.3.6 as an Apache 1.3 module on Windows 2000. OK, now the array performance problem -- I have a simple script that basically just has a 2 dimensional array with this structure: [4-10 character key][int key] = int value. For my examples, the array, $big_arr, has ~40k elements, and ~100k total at the second level. I fill this array in a loop. Then I have this code: $list = implode("','", array_keys($big_arr)); $r = mysql_query(<query using each $big_arr key>); while ($tmp = mysql_fetch_assoc($r)) { $foo[$tmp['key for string value']] = $tmp; // just 8 small columns in $tmp } The problem is that it takes over 2 seconds to fill the $foo array with ~40k array elements. Ugh! (Still ~1.4s if I use the same 123 scalar value for each.) That's not counting any time to do the query or fetch the rows. I'm thinking it has something to do with $big_arr using a lot of memory (how much??), because a script with just this code: for ($i = 0; $i < 40000; ++$i) { $test["test$i"] = $i; } ... creates 40k elements in 0.3s, *including* the loop's running time. Finally, I tried to unset($big_arr) before filling $foo, but that *increased* running time by ~3.5s! :-( (The unset() took about 0.3s.) Why is that causing $foo to be filled slower?! Is PHP searching for free memory for $foo that had been used by $big_arr? This is disappointing, especially being caused by an array that doesn't seem too outrageously large (and I'd like to go larger). :-( It's going to suck if I can't come up with a way to get it faster... Is there anything that would be different on a version newer than 4.3.6, as I didn't try any yet? Or if it's some Windows thing, then I don't care as much. Comments, suggestions? Thanks! Matt

« previous php.internals (#14034) next »