ugrás a tartalomhoz

Függvényből való kilépés, visszalépés.. lehetséges? (php5.x)

EL Tebe · 2009. Nov. 20. (P), 15.02
Sziasztok!

Van egy függvényem, azon belül - sokminden más mellett - egy tömböt feltöltő ciklus.

Ez a tömb 30-50 MBytenyira is simán meghízik, így elérem a max memória-korlátot és lehal a progi.

A címben látható dologra gondoltam, azonban nem tudom hogyan lehet megvalósítani :(
X elemenként a függvény kidobná az addigi eredményt, majd a tömböt törölném és egy újba kezdenék belepakolni.

Tehát szeretnék valamilyen úton-módon visszakerülni a ciklusba (és az azt tartalmazó függvénybe) és folytatni azt.

Ötletek?
Vagy rossz az elgondolás is?
 
1

sok

Drawain · 2009. Nov. 20. (P), 15.24
Biztos, hogy te ilyen nagy adatmennyiséggel akarsz dolgozni php-ban? Mármint, ha egy adatkezeléssel kapcsolatos dolog megoldható adatbázisszinten, akkor érdemes ott, illetve ha egyből kimenetet generálnál, akkor is megúsznád a memória túlcsordulását. Egyébként van lehetőség arra, hogy a kimenetet részletekben küldjed el, az output buffer vezérlését nézzed meg. Ekkor minden flush után töröld a tömböt és hívd meg újra a függvényt egy paraméterrel, hogy melyik elemtől folytassa.
2

igen,

EL Tebe · 2009. Nov. 20. (P), 17.02
Igen, sajnos muszáj így megoldanom, mert egyrészt az adatbázisba is megy egy ilyen mennyiségű adat, és onnan visszafelé is: azok feldolgozását a php-vel végzem, más lehetőség nincs.
Ráadásul ez a mennyiségű adat egyáltalán nem kerül kiíratásra.
3

Muszáj

Poetro · 2009. Nov. 20. (P), 19.44
Ha nem lehet így megoldani, akkor nem muszáj így megoldani, hanem keresel alternatív megoldást, ami kevésbé memória éhes. Nem hiszem, hogy ne lehetne egy kisebb, mondjuk 10-50-100 sornyi adattal dolgozni egy huzamban. Az adatbázis arra való, hogy nagy adatokkal dolgozzunk benne, rendezgessük, újraszervezzük, a PHP-ben pedig csak az adatokkal történő nagy bonyolultságú műveleteket végezzük. Mivel nem árulsz el részleteket arról, miért kell neked sok sok MB-nyi adatot memóriában tárolni, nehéz segíteni. És azt se hiszem, hogy ezt a sok sok MB adatot egy lekérdezéssel írod vissza az adatbázisba, mert akkor ott is problémákba ütköznél szvsz, mivel túllépnéd a maximális query limitet.
4

hmm

zzrek · 2009. Nov. 20. (P), 22.07
Ha ez meg lehet oldani:
...X elemenként a függvény kidobná az addigi eredményt, majd a tömböt törölném és egy újba kezdenék belepakolni.

... akkor miért nem csinálod ugyanezt függvényen belül? Úgy értem, hogy "X elemenként" az eredményt berakod egy másik tömbbe, és akkor a munkatömb feldolgozott részét törölheted.
Nem kell kilépni és visszalépni egy függvénybe ahhoz, hogy részeredményeket összesíts, vagy gyűjts, majd a folyamat végén leadj.
5

másik tömb

Drawain · 2009. Nov. 21. (Szo), 11.31
Attól, hogy másik tömbbe rakod, a memóriafoglalás ugyanúgy megmarad. Itt tényleg inkább alapvetően más megoldást kell keresni, de sajnos a kérdező nem adott elég információt ill. kód hiányában így nem nagyon lehet segíteni ebben... Egyébként én még mindig nem tudom elképzelni azt a helyzetet, hogy mindenképpen ilyen nagy adattömbökkel kénytelen dolgozni az ember.
6

Én sem tudom mit akar pontosan

zzrek · 2009. Nov. 21. (Szo), 12.21
Én sem tudom mit akar pontosan, de az alapján amit írt, ő úgy gondolja, hogy ha kilép a függvényből, csinál valamit, majd visszalép, azzal megoldhatja a problémát. Ebből következtettem, és javasoltam, hogy ugyanezt a műveletet a függvényen belül megoldva is elvégezheti. Ha részeredményeket gyűjt, azt beleteheti egy tömbbe, amit aztán visszatérési értékként leadhat (vagyis nem arra buzdítottam hogy rakja egy másik tömbbe az egészet)
7

Egy X mbyte-os excelből nyert

EL Tebe · 2009. Nov. 27. (P), 19.19
Egy X mbyte-os excelből nyert csv fájlt kapok, majd bepakolom a megfelelő adatbázistáblákba (kül. feltételekkel, de ez most nem lényeg).
Ezzel nincs is nagyon nagy gond.
Egy sort kb. úgy kell elképzelni, hogy van 10-15 oszlopa.
A sorokból pedig sokszor többezer - mikor hogy.

A feltöltéssel még nincs is gond.

Azonban amikor lekérdezem a felvitt adatokat, ahhoz hogy egy darab mail-ben kiküldjem (tartalom táblázatos formában), akkor nincs lehetőségem az adatok egyik felét lekérdezni, aztán a másik felét, csak egyszerre megy. (csak szerintem)

Sajnos a csatolmány nem jó megoldás, (a levélküldés sem, dehát..)
Van valami ötletetek?
Az segíthet, ha az egésszet egy stringként kezelem és nem X db. tömbelemként?
8

limit

gex · 2009. Nov. 27. (P), 19.35
nincs lehetőségem az adatok egyik felét lekérdezni, aztán a másik felét
dehogynem, erre van a limit.
9

Tempfile, sendmail

vbence · 2009. Nov. 28. (Szo), 11.14
Ahogy jönnek az adatok, úgy írod ki a mail tartalmát egy fájlba. Majd:
exec ('sendmail <tempfile');
10

szuper,

EL Tebe · 2009. Nov. 30. (H), 15.29
köszönöm, ilyesmi megoldásra gondoltam. ;)