Citaat:
Oorspronkelijk geplaatst door
Rollerscapes
Kijk is heel goed naar de interne werking :)
Bij het PDO voorbeeld doe je de Query voorbereiden, zodat hij hem elke keer kan hergebruiken zonder eerst te moeten controleren of de syntax wel goed is en zo.
Met de ORM, moet hij elke keer de query controleren.
Moet je die query wel in dezelfde pagina nog een keer nodig hebben.
Citaat:
Ja en nee, als je in PHP een query uitvoert die resultaten teruggeeft.
Worden die in het geheugen van PHP bewaard, maar op het moment dat je ze gaat gebruiken als object/array dan moet hij ze omgaan zetten.
En dan krijg je een dubbele set.
Zodra het resultaat naar object is omgezet kan de oorspronkelijke set weg.
Citaat:
De informatie rij per rij uitlezen via een Iterator, welke ook word ondersteund door PDO is dan efficiënter. Voor het PHP uitvoer gedeelte doe je dan enkel per record(set) de gegevens uitlezen en verwerken.
Dan werk je echt met een cursor (bij PDO dan).
Wat versta je precies onder Iterator?
Als je bedoelt met PDOStatement->fetch() iteratief uitlezen: dat is geen magische oplossing om geheugenproblemen te voorkomen kwam ik van de week achter. :)
Hij buffert dan nog steeds de gehele resultset (niet slechts 1 record) in het geheugen op het moment dat je de query uitvoert (nog voordat je fetch() aanroept).
En dat gaat met tabellen van tig GB per stuk niet echt lekker.
Citaat:
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(16): failed
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(9): failed
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(3): failed
Oct 14 19:19:26 www3 last message repeated 155 times
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(13): failed
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(16): failed
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(2): failed
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(2): failed
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(8): failed
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(16): failed
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(2): failed
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(4): failed
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(16): failed
Oct 14 19:19:26 www3 kernel: swap_pager_getswapspace(16): failed
Oct 14 19:19:26 www3 kernel: pid 35600 (php), uid 1001, was killed: out of swap space
Na het gebruik van de "echte" cursor functionaliteit van PostgreSQL werkte exact hetzelfde script wel goed.
Dus na "SELECT * FROM tabel" te hebben vervangen voor:
"DECLARE c CURSOR FOR SELECT * FROM tabel"
En dan met "FETCH 100 FROM c" in kleinere stapjes uitlezen.
Citaat:
En soms moet je grote hoeveelheden invoeren/exporteren, dus doe je dat stukje voor stukje.
Wat doe Doctrine? Buffert elke invoer, en voert die later later uit!
Maar goed, Doctrine staat niet synoniem voor ORM.
Andere implementaties zoals PHP AR voeren wel meteen de query uit op het moment dat je save() doet.
Citaat:
Exporteren het zelfde verhaal, hij gaat eerst een grote hoeveelheid objecten maken die je vervolgens kan doorlopen (1000 records = 1000 objecten).
En omdat hij ze eerst moet aanmaken, heb je niet dat voor elke iteratie een object word aangemaakt en weer verwijderd :D Je hebt echt 1000 objecten en groot probleem.
Je moet ook niet tegen je ORM zeggen: geef me alle records, want dan maakt hij inderdaad meteen 1000 objecten aan, maar je moet om een subset vragen.
Dan maakt hij alleen objectjes voor de subset waar je om gevraagd hebt aan.
Net zoals je met PDO dus met cursors (of condities) moet werken, anders gaat het met grote sets net zo hard mis.