Jump to content
php.lv forumi

PHP atmiņas resursu izlietojums


DarkSide

Recommended Posts

Sveiki!

 

Vai kaads var iedot kaaru URLi vai ko tamliidziigu, kur var palasiities kaa preciizaak PHP izmanto webservera (Apache uz Windows) atminju. Probleema ir taada, ka man ir viens PHP skriptinjsh, kas dara ljoti apjomiigus darbus un darbojas kaadas 5min uz localhost. Ideja taada, ka njem no vienas mysql datubaazes tabulas visus ID, DATI peec kaartas un analizee tos un glabaa kaadaa citaa tabulaa. Luuk pseidoskritps:

$Q = "SELECT id,dati FROM tabula";
$R = mysql_query($db,$Q);
while($row = mysql_fetch_row($db,$R)) {
$sadalits = split(' ',$row['dati']);
foreach($sadalits as $value) {
	$Q2 = "INSERT INTO tabula2(datu_dalja)VALUES($value)";
	$R2 = mysq_query($db,Q2);
}
}

Piedodiet, ka skriptaa ir kaadas kljuudas - tas ir tikai kaa idejas paraugs. Doma taada, ka tabulaa "tabula" ir ljoti daudz rindu (kaadas miljons)... Probleema ir ka webserverim vajag >1Gb atminjas!!! Lai ar to tiktu galaa, bet tik daudz jau nu gan nevajadzeeja buut... Itkaa tachu parsee sanjemtos datus no mysql pa vienai rindinjai utt... Sanaak, ka PHP kautkaa atceras arii visas vecaas mainiigo veertiibas vai kaa??? Pastaastiet kautko no pieredzes.

 

P.S. Man nevajag lai skripts buutu super optimaals, bet tikai lai tas apeed mazaak atminjas, jo savadak webserveris karas nost :((

 

Edited: Es te taa padomaaju, varbuut probleema ir tur, ka sanaak vairaakus mysql resultsetus vienu ieksh otra apstraadaat? Vareetu taa buut?

Edited by DarkSide
Link to comment
Share on other sites

Papēti vai netišām neiesetojas kaut kādi jauni mainīgie (nevis pārrakstīti vecie) .. teiksim tas pats $row[dati] (lai arī pseido kodā tas nenotiek bet varbūt reālajā gan).

 

Otrs - INSERT kverijiem nevajag vispār piešķirt nekādu mainīgo (kas nedaudz mazina izmantojamās atmiņas apjomu) proti izpildi:

mysql_query("INSERT INTO tabula2(datu_dalja)VALUES($value)");

 

 

Trešais - labs nav foreach()

 

foreach($sadalits as $value) {

 

izmanto vai nu for() vai while(list = each($sadalits) utt..

 

Jo foreach duplicē esošo masīvu (aizņem jau divreiz vairāk atmiņas un pie liela elementu/datu apjoma ir sāpīgi) un tikai tad veic darbības ar to

 

"Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. Therefore, the array pointer is not modified as with the each() construct, and changes to the array element returned are not reflected in the original array"

Link to comment
Share on other sites

Papēti vai netišām neiesetojas kaut kādi jauni mainīgie (nevis pārrakstīti vecie) .. teiksim tas pats $row[dati] (lai arī pseido kodā tas nenotiek bet varbūt reālajā gan).
Nav jaunu mainiigo. Katraa ciklaa itkaa tiek rakstiits pa virsu vecajiem mainiigajiem.
Otrs - INSERT kverijiem nevajag vispār piešķirt nekādu mainīgo (kas nedaudz mazina izmantojamās atmiņas apjomu) proti izpildi:

mysql_query("INSERT INTO tabula2(datu_dalja)VALUES($value)");

Ok - taa izdariiju, bet tas ietaupa varbuut kaadu lieku megabaitinju, bet ne jau gigabaitu :)

Trešais - labs nav foreach()

foreach($sadalits as $value) {

izmanto vai nu for() vai while(list = each($sadalits) utt..

Jo foreach duplicē esošo masīvu (aizņem jau divreiz vairāk atmiņas un pie liela elementu/datu apjoma ir sāpīgi) un tikai tad veic darbības ar to

Istaja koda izmantoju while un for. Foreach uzrakstijas automatiski tikai sheit pseidokodaa...

Rodas taada sajuuta, ka PHP kautkaa katraa cikla reizee nevis uzraksta pa virsu vecajam mainiigajam (mainot taa veertiibu), bet, mainot veco mainiigo, rezervee jaunu atminjas apgabalu, kur glabaat sho jauno vecaa mainigaa veertiibu... Bet taa tachu nevareetu buut? Lietoju 4.0.20a PHP versiju - zinu ka veca, bet taa vajag.

Link to comment
Share on other sites

peec kaa noteici, ka vajag 1GB atminjas?

Noteicu peec taa ka man kompim ir 256Mb un tas saak swapot uz HDD + Windows Task Managerii var redzeet izmantoto atminjas daudzumu.

 

Veel vien interesanta detalja - probleema ir ar kautkaadu bufferoshanu laikam, jo skripts itkaa beidz savu darbiibu (ilgi gaidiiju, bet sagaidiiju), bet atminja atbriivojas ljoti leenaam (un konstanti) un weblapa netiek nosuutiita uz klientu. Par to ka skripts beidzis savu darbiibu spriezhu peec taa, ka paraleeli piesleedzoties mysql datubaazei ar citu konekciju es redzu, ka visi ID jau tabulaa ielikti, bet skripts veel arvien darbojas. Taatad probleema kautkaadaa buferoshanaa. Var jau buut, ka MySQL nevis pats PHP, lai gan diez vai, jo mysql jau paraada visus tos ierakstus kam buutu jaabuut datubaazee peec skripta izpildes, bet skripts veel arvien nebeidzas... Vo kameer rakstiiju beidzaas, bet kautkaa jokaini tas viss tomeer :(

Link to comment
Share on other sites

×
×
  • Create New...