Geheugen loopt vol, waar zit lek?
Ik heb een script gemaakt voor een spel genaamd tribalwars, de mysql database is in totaal 20MB groot, maar bij het volgende script loopt toch steeds mijn memory limit van php(zelfs bij 128MB) vol. Iemand die weet waar de lek zit?
Andere verbeteringen in dit script zijn ook gewoon welkom, zoals die mysql query, kan volgens mij ook wel wat beter aan.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
$center = array('x' => 500,'y' => 500);
$zoom = 1;
$part = (1000/$zoom)/2;
$x_min = $center['x']-$part;
$x_max = $center['x']+$part;
$y_min = $center['y']-$part;
$y_max = $center['y']+$part;
$mysql = new PDO('mysql:host=localhost;dbname=tribalwars' , 'root' , '******');
$query = $mysql->prepare("SELECT v.x, v.y, v.player, p.name AS playername, p.ally, a.tag AS allytag FROM villages AS v, players AS p, allies AS a WHERE p.id = v.player AND a.id = p.ally AND v.x > :x_min AND v.x < :x_max AND v.y > :y_min AND v.y < :y_max");
$query->execute(array(':x_min' => $x_min,
':x_max' => $x_max,
':y_min' => $y_min,
':y_max' => $y_max));
$fetched = $query->fetchAll();
$img = imagecreate(1000,1000);
$black = imagecolorallocate($img, 0, 0, 0);
$white = imagecolorallocate($img, 255, 255, 255);
$red = imagecolorallocate($img, 255, 0, 0);
$green = imagecolorallocate($img, 0, 0, 255);
$blue = imagecolorallocate($img, 0, 255, 0);
$gray = imagecolorallocate($img, 150, 150, 150);
foreach($fetched as $fetchid => $village)
{
$village['x'] = ($village['x'] - $x_min)*$zoom;
$village['y'] = ($village['y'] - $y_min)*$zoom;
imagesetpixel($img, $village['x'], $village['y'], $white);
unset($fetched[$fetchid]);//Save some memory
}
header("Content-type: image/jpeg");
imagejpeg($img);
imagedestroy($img);
?>
$center = array('x' => 500,'y' => 500);
$zoom = 1;
$part = (1000/$zoom)/2;
$x_min = $center['x']-$part;
$x_max = $center['x']+$part;
$y_min = $center['y']-$part;
$y_max = $center['y']+$part;
$mysql = new PDO('mysql:host=localhost;dbname=tribalwars' , 'root' , '******');
$query = $mysql->prepare("SELECT v.x, v.y, v.player, p.name AS playername, p.ally, a.tag AS allytag FROM villages AS v, players AS p, allies AS a WHERE p.id = v.player AND a.id = p.ally AND v.x > :x_min AND v.x < :x_max AND v.y > :y_min AND v.y < :y_max");
$query->execute(array(':x_min' => $x_min,
':x_max' => $x_max,
':y_min' => $y_min,
':y_max' => $y_max));
$fetched = $query->fetchAll();
$img = imagecreate(1000,1000);
$black = imagecolorallocate($img, 0, 0, 0);
$white = imagecolorallocate($img, 255, 255, 255);
$red = imagecolorallocate($img, 255, 0, 0);
$green = imagecolorallocate($img, 0, 0, 255);
$blue = imagecolorallocate($img, 0, 255, 0);
$gray = imagecolorallocate($img, 150, 150, 150);
foreach($fetched as $fetchid => $village)
{
$village['x'] = ($village['x'] - $x_min)*$zoom;
$village['y'] = ($village['y'] - $y_min)*$zoom;
imagesetpixel($img, $village['x'], $village['y'], $white);
unset($fetched[$fetchid]);//Save some memory
}
header("Content-type: image/jpeg");
imagejpeg($img);
imagedestroy($img);
?>
Andere verbeteringen in dit script zijn ook gewoon welkom, zoals die mysql query, kan volgens mij ook wel wat beter aan.
Gewijzigd op 01/01/1970 01:00:00 door Teun Beijers
Gesponsorde koppelingen:
Het kan zijn dat het plaatje dat je creëert te groot is. Probeer het maar eens met een plaatje van 100 bij 100.
Jan Koehoorn schreef op 02.08.2009 22:18:
Het kan zijn dat het plaatje dat je creëert te groot is. Probeer het maar eens met een plaatje van 100 bij 100.
Geeft precies hetzelfde effect, plaatje van 1000x1000 is me al gelukt op andere manier, maar sinds ik het via de database doe gaat het niet goed
je haalt data op uit de DB en zet je in een array hoe groot is die array ??? je haalt tog niet ales op DB !
@ Wesley sorry ik probeer het zo veel mogelijk het goed neer te zetten maar het valt niet altijt me "Ja ik gebruik word en google"
@ Wesley sorry ik probeer het zo veel mogelijk het goed neer te zetten maar het valt niet altijt me "Ja ik gebruik word en google"
Gewijzigd op 01/01/1970 01:00:00 door johan
@Johan: Dit is zeker ook dyslexie?
Er al eens aan gedacht om misschien op eerdere plekken in je script een exit te gooien? zodat je stukje voor stukje kan kijken tot waar het goed gaat? Bijvoorbeeld eens kijken welke data je allemaal hebt in het script op dat moment *moment van de exit*. Als ik het niet kan vinden doe ik dat.
Er al eens aan gedacht om misschien op eerdere plekken in je script een exit te gooien? zodat je stukje voor stukje kan kijken tot waar het goed gaat? Bijvoorbeeld eens kijken welke data je allemaal hebt in het script op dat moment *moment van de exit*. Als ik het niet kan vinden doe ik dat.
handig. Was vast niet voor mij bedoeld, maar ik zal het eens lezen. btw, WES.. vette hamster.
Je kan heel $fetched achterwege laten, en de foreach-lus over $query heen laten wandelen (PDOStatement instanties zijn namelijk itereerbaar) Dan fetcht hij één resultaat per wandeling, en heb je niet al je resultaten tegelijkertijd in het geheugen.
Je mag er ook een while-lus van maken en $query->fetch(PDO::FETCH_ASSOC) gebruiken, achter de schermen betekent doet dit ongeveer hetzelfde. Het resultaat is in ieder geval hetzelfde :)
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
foreach($query as $village)
{
$village['x'] = ($village['x'] - $x_min)*$zoom;
$village['y'] = ($village['y'] - $y_min)*$zoom;
imagesetpixel($img, $village['x'], $village['y'], $white);
}
?>
foreach($query as $village)
{
$village['x'] = ($village['x'] - $x_min)*$zoom;
$village['y'] = ($village['y'] - $y_min)*$zoom;
imagesetpixel($img, $village['x'], $village['y'], $white);
}
?>
Je mag er ook een while-lus van maken en $query->fetch(PDO::FETCH_ASSOC) gebruiken, achter de schermen betekent doet dit ongeveer hetzelfde. Het resultaat is in ieder geval hetzelfde :)
Dankje jelmer, ik was toevallig zelf al op die oplossing gekomen, en hij werkt wel ;).
En dat is ?
@ johan: dat schrijft Jelmer toch? In plaats van:
doe je
Je kunt een PDOStatement variabele gewoon met foreach doorlopen (dat bedoelt Jelmer met itereerbaar)
doe je
Je kunt een PDOStatement variabele gewoon met foreach doorlopen (dat bedoelt Jelmer met itereerbaar)



