Hallo mensen,

Ik ben bezig met array manipulatie maar ben niet zo goed in het efficient verwerken ervan.

Ik heb "space seperated file" waarvan de eerste regel de header is van een table
en de overige regels zijn de data.

Nu doe ik het volgende:


$lines = file($this->resfile);
$counter = 0;
foreach($lines as $linenum => $line) {
	if($counter == 0) {
		$this->header_array = explode(' ',rtrim($line));
	}
	else {
		$tmp = explode(' ',rtrim($line)); // haal rechter \n eraf
		if($this->format != '') { // soms willen we formatten...
			foreach($tmp as $key => $val) {
				$tmp[$key] = sprintf($this->format,$val);
			}
		}
		$this->data_array[] = $tmp;							
		unset($tmp);
	}
	$counter++;
}


de data_array die deze functie uitspuugt bevat dus in het geval van de file die ik heb 4000 arrays die elk weer 202 lang zijn...

Van mijn testserver heb ik de memory limit van 128 -> 256 -> 512 moeten opschroeven om de pagina goed te krijgen...

De machine waar dit straks op gaat draaien heeft maar 256 mb ram...
Het moet efficienter kunnen.
Je werkt hier met twee grote arrays.
- $lines, deze is meteen al groot
- $this->data_array, wordt steeds groter

Door nu de verwerkte regels in $lines te verwijderen,
zou je probleem wel eens opgelost kunnen zijn.

<?php
unset($tmp, $lines[$linenum]);
?>
Ik heb jou extraatje geprobeerd, maar het lijkt geen effect te hebben.
Bij het parsen van mijn file is de memory usage nog steeds 261MB :D

Het grootste probleem is echter dat Firefox 92sec. nodig heeft om de pagina te laden :)

Maar goed, de geformatte arrays kunnen ook gedownload worden om vervolgens geopend te worden in Excel, dus het is geen doodlopende straat waarin ik mij bevind. Nog meer suggesties?
Waarom zulke grote arrays. Mischien moet je de optimalisatie al eerder doen??

Reageren