Memory needed for arrays? And major performance problems filling an array
| From: | Matt W | 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