Autor Zpráva
amorekj
Profil
Dobrý den,
předem se omlouvám za hloupou otázku, ale opět nevím, kde dělám chybu. Limit je navýšen na 64MB a stejně nestačí. Údaje bych si chtěl ukládat do PHP z důvodu dalšího použití.

Chyba:
Fatal error: Allowed memory size of 41943040 bytes exhausted (tried to allocate 536 bytes) on line 23

$i=1;
$vypis = mysql_query("SELECT * FROM `--`");
while ($zaznam = mysql_fetch_array($vypis )){

$datum = strtotime($zaznam["od"]);
$zarazka = strtotime($zaznam["do"] . ' + 1 day');
while($datum < $zarazka) {
  $formatovany = date('d.m.Y', $datum);
  
  $cas[$i] = $zaznam["apartman"];
  $cas[$i."_datum"] = $formatovany;
  $cas[$i."_jmeno"] = $zaznam["jmeno"];
  $cas[$i."_poznamky"] = $zaznam["poznamky"];
  $cas[$i."_id"] = $zaznam["id"];
  $i++;
}
}

Děkuji za Vaše odpovědi. Za vše jsem moc rád.
Micruss
Profil
Co zkusit omezit počet vypisovaných dat ? A nebo opět navýšit limit na 128mb -.-
Fisir
Profil
Reaguji na amorekje:
Možná by pomohlo nastavit „zarážku“ přímo v SQL dotazu a pokud nevybíráte všechny sloupce, tak specifikovat, které ano.

on line 23
Značí, že se paměť zaplnila na této řádce. S největší pravděpodobností bude ale problém někde výše v kódu.
amorekj
Profil
Občas to píše:
Fatal error: Maximum execution time of 30 seconds exceeded on line 23

Z databáze to tahám vše s tím, že se to dole pak přehodnocuje, co je v danou chvíli užitečné - příp. se to zvýrazní a odkazuje na další stránku. Data se ukládají do PHP tím, že se vypíší všechny datumy (co jsou mezi od do) - dalo by se to omezit max. že by se vypisovali jen datumy, kterých se to týká v daném měsíci - tam mám proměnnou $month, nevím ale jak by SQL dotaz měl znít.

Webový hosting mi napsal, že většině stačí 32 MB. Já mám 64 MB a prý v kódu mám zbytečnosti, které by se daly odstranit a určitě by pomohly i k rychlosti chodu aplikace. Nahoře je tedy část kódu, která paměť tolik zaplní.
Mike8748
Profil
amorekj:
já ti nevím, ale ten vnitřní cyklus na řádkách 7-16 podle mě nikdy neskončí (donekonečna plní pole $cas stejnýma datama) dokud ti nedojde pamět (nevidim tam změnu proměnné $datum takže podmínka cyklu bude vždy platit)

navíc tam opakovaně vkládáš z DB poznámky (což ti v případě dlouhých textů akorat rychleji sežere paměť)
Micruss
Profil
A taky, místo while($datum....), nechtěl jste dát if?
janbarasek
Profil
amorekj:
Zkus udělat úplně jednoduchou kontrolu, jestli to náhodou není nekonečný cykl, já to zjišťuji obvykle úplně jednoduše:
<?php
$i = 0;
while (...) {
  $i++;
  if ($i >= 5000) { echo 'BACHA: Přetýká zásobník!'; break; }
}
Můžeš si tam nastavit libovolné velké číslo. Tuto ochranu je vhodné dávat do každého cyklu, kde pracuješ s neznámým počtem položek, aby se nemohlo stát, že nikdy neskončí.
amorekj
Profil
Máte pravdu - místo while tam mělo být if :) Děkuji za upozornění.

Ta ochrana je dobrá věc - to určitě začnu používat :)

Už mi to jede normálně. Moc dík :) moc moc :)
Keeehi
Profil
amorekj:
Ta ochrana je dobrá věc
Mě to zase až tak moc úžasné nepřijde. Při vývoji a testování možná, ale ve finálním kódu to není potřeba. Nejlepší je si nastavit limit už při výběru z databáze jelikož se nepřenáší zbytečná data.
Alphard
Profil
amorekj:
Ta ochrana je dobrá věc - to určitě začnu používat
Těžko, neřeší to problém blbě navržené konstrukce, raději investujte více času do návrhu algoritmu samotného.
Nesouhlasím ani s tím, že je to rozumné používat to při testování, naopak by to mohlo skrývat chyby.
aDAm
Profil
Přetýká to je dobrej češtin ;)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: