Fatal error: Allowed memory size of 33554432 bytes exhausted

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
FCM
Mitglied
Beiträge: 1863
Registriert: 03.05.2006 14:47
Kontaktdaten:

Fatal error: Allowed memory size of 33554432 bytes exhausted

Beitrag von FCM »

Hallo,

ich habe ein Skript, welches Text zu meiner Handschrift umwandelt. Dazu habe ich 52 kleine Bilddateien (26 für Großbuchtstaben und 26 für Kleinbuchtstaben). Die Zeichen (ABC ..., abc ...) werden einzeln ersetzt. Doch bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 18816541 bytes) in *** on line 37
Warum? Hier der Code:

Code: Alles auswählen

<?php

$mode = $_GET['mode'];

if ($mode == 'do_it') {
	$text = $_POST['text'];
	$p = 0.3;
	
	$i_size = array('./gross/space.gif', './gross/a.gif', './gross/b.gif', './gross/c.gif', './gross/d.gif', './gross/e.gif', './gross/f.gif', 
				'./gross/g.gif', './gross/h.gif', './gross/i.gif', './gross/j.gif', './gross/k.gif', './gross/l.gif',
				'./gross/m.gif', './gross/n.gif', './gross/o.gif', './gross/p.gif', './gross/q.gif', './gross/r.gif',
				 './gross/s.gif', './gross/t.gif', './gross/u.gif', './gross/v.gif', './gross/w.gif', './gross/x.gif',
				  './gross/y.gif', './gross/z.gif'
	);
				  
	$i_size2 = array('./klein/a.gif', './klein/b.gif', './klein/c.gif', './klein/d.gif', './klein/e.gif', './klein/f.gif',
				  './klein/g.gif', './klein/h.gif', './klein/i.gif', './klein/j.gif', './klein/k.gif', './klein/l.gif', './klein/m.gif', './klein/n.gif', 
				  './klein/o.gif', './klein/p.gif', './klein/q.gif', './klein/r.gif', './klein/s.gif', './klein/t.gif', './klein/u.gif', './klein/v.gif', 
				  './klein/w.gif', './klein/x.gif', './klein/y.gif', './klein/z.gif'
	);
	
	$r = array(' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
	$r2 = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
	
	$num = 0;
	
	while ($num <= 27) {
		$size = getimagesize($i_size[$num]);
		$text = str_replace($r[$num], '<img style="width: ' . $size[0] * $p . 'px; height: ' . $size[1] * $p . 'px;" src="' . $i_size[$num] . '" />', $text);
		$num++;
	}
	
	$num2 = 0;
	
	while ($num2 <= 26) {
		$size = getimagesize($i_size2[$num2]);
		$text = str_replace($r2[$num2], '<img style="width: ' . $size[0] * $p . 'px; height: ' . $size[1] * $p . 'px;" src="' . $i_size[$num2] . '" />', $text);
		$num2++;
	}
	
	echo nl2br($text);
	
}

?>
Boecki91
Ehemaliges Teammitglied
Beiträge: 4744
Registriert: 18.06.2006 15:21

Beitrag von Boecki91 »

Das Bild wird größer als der zur Verfügung stehende Arbeitsspeicher von ca. 32MB, oder die Anzahl der eingelesenen Bilder. Auf jeden Fall zu Viel

Dachte eigendlich das du sowas mit Google herausfinden kannst :roll:

Vielleicht die größe als Festwert speichern?
Standart: Am besten mit beiden Beinen auf dem Boden
Standardmäßig antworte ich nicht auf PMs
Benutzeravatar
djchrisnet
Mitglied
Beiträge: 1275
Registriert: 29.06.2007 15:52
Wohnort: Elmshorn
Kontaktdaten:

Beitrag von djchrisnet »

einfach $size wieder freigeben nachdem du die daten eingefügt hast..
$text = .......;
unset($size);
Zuletzt geändert von djchrisnet am 06.12.2008 23:37, insgesamt 1-mal geändert.
FCM
Mitglied
Beiträge: 1863
Registriert: 03.05.2006 14:47
Kontaktdaten:

Beitrag von FCM »

Genau. Und wenn ich den Memory erhöhe (sogar auf 6000M) ändert sich auch nichts.
FCM
Mitglied
Beiträge: 1863
Registriert: 03.05.2006 14:47
Kontaktdaten:

Beitrag von FCM »

Hatte ich auch schon probiert, half und hilft aber leider nicht. Wenn ich das str_replace() nicht mache, kommt auch der Fehler nicht.

(Sorry für den Doppelpost, er hat editiert)
Benutzeravatar
atrox
Mitglied
Beiträge: 242
Registriert: 08.08.2007 00:48
Wohnort: Ravensburg

Beitrag von atrox »

Ändert sich etwas, wenn du den Wert direkt in der Datei zuweist?
piero
Mitglied
Beiträge: 476
Registriert: 10.11.2008 17:15
Wohnort: Schweiz

Beitrag von piero »

da ist ein kleiner denkfehler drin... ;)

angenommen du gibst deinem script den text "a"

dieser wird nun im ersten durchlauf (buchstabe a)ersetzt durch '<img style="width:1px;height:1px" src="/klein/a.gif" />'

dann bekommst du für den zweiten durchlauf (buchstabe b) zwar keine ersetzung...
dafür wird beim dritten durchlauf (buchstabe c) das c bei "src=" ersetzt durch dein bild, was ja nicht sein sollte ;)
usw...

nimm die funktion strtr() und ersetze alles in einem mal, dann wird das gemacht, was du willst ;)
Wenn der Aufruf mit zwei Argumenten durchgeführt wird, verhält sich die Funktion anders: from muss nun ein Array sein, das string -> string-Paare enthält, die im Originalstring ersetzt werden sollen. strtr() tauscht dabei zuerst die längsten möglichen Treffer aus und verändert bereits durchgeführte Ersetzungen *NICHT*.
folglicherweise die funktion so benutzen:

Code: Alles auswählen

$l = array('a' => './klein/a.gif', 'b' => './klein/b.gif', .... , 'Z' => './gross/z.gif')
$text = strtr($text, )
wichtig: die funktion nicht ein zweites mal auf den gleichen text anwenden ;)
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

Du hast eine Schleife gebaut, da Du $text mehrfach zugewiesen hast und in der WHILE-Schleife immer wieder einen neuen Wert gibst. Benutze in der Schleife meinetwegen $text_img oder was Dir am besten gefällt.
Ausserdem änderst Du die Änderungen beim folgendenden Durchlauf gleich wieder.
So kann es klappen:

Code: Alles auswählen

<?php
$text = $_GET['text'];
$repl = array(	'a' => '<img src="./klein/a.gif">',
				'b' => '<img src="./klein/b.gif">',
				'c' => '<img src="./klein/c.gif">',
				'd' => '<img src="./klein/d.gif">',
				'e' => '<img src="./klein/e.gif">',
				'f' => '<img src="./klein/f.gif">',
				'g' => '<img src="./klein/g.gif">', 
				'h' => '<img src="./klein/h.gif">', 
				'i' => '<img src="./klein/i.gif">', 
				'j' => '<img src="./klein/j.gif">', 
				'k' => '<img src="./klein/k.gif">', 
				'l' => '<img src="./klein/l.gif">',
				'm' => '<img src="./klein/m.gif">',
				'n' => '<img src="./klein/n.gif">',
				'o' => '<img src="./klein/o.gif">',
				'p' => '<img src="./klein/p.gif">',
				'q' => '<img src="./klein/q.gif">', 
				'r' => '<img src="./klein/r.gif">',
				's' => '<img src="./klein/s.gif">',
				't' => '<img src="./klein/t.gif">',
				'u' => '<img src="./klein/u.gif">',
				'v' => '<img src="./klein/v.gif">',
				'w' => '<img src="./klein/w.gif">',
				'x' => '<img src="./klein/x.gif">',
				'y' => '<img src="./klein/y.gif">',
				'z' => '<img src="./klein/z.gif">',
				'A' => '<img src="./gross/a.gif">',
				'B' => '<img src="./gross/b.gif">',
				'C' => '<img src="./gross/c.gif">',
				'D' => '<img src="./gross/d.gif">',
				'E' => '<img src="./gross/e.gif">',
				'F' => '<img src="./gross/f.gif">',
				'G' => '<img src="./gross/g.gif">', 
				'H' => '<img src="./gross/h.gif">', 
				'I' => '<img src="./gross/i.gif">', 
				'J' => '<img src="./gross/j.gif">', 
				'K' => '<img src="./gross/k.gif">', 
				'L' => '<img src="./gross/l.gif">',
				'M' => '<img src="./gross/m.gif">',
				'N' => '<img src="./gross/n.gif">',
				'O' => '<img src="./gross/o.gif">',
				'P' => '<img src="./gross/p.gif">',
				'Q' => '<img src="./gross/q.gif">', 
				'R' => '<img src="./gross/r.gif">',
				'S' => '<img src="./gross/s.gif">',
				'T' => '<img src="./gross/t.gif">',
				'U' => '<img src="./gross/u.gif">',
				'V' => '<img src="./gross/v.gif">',
				'W' => '<img src="./gross/w.gif">',
				'X' => '<img src="./gross/x.gif">',
				'Y' => '<img src="./gross/y.gif">',
				'Z' => '<img src="./gross/z.gif">'
			);
echo strtr($text, $repl);			
?>

//Edit: Zu Spät.
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
FCM
Mitglied
Beiträge: 1863
Registriert: 03.05.2006 14:47
Kontaktdaten:

Beitrag von FCM »

Ach jetzt verstehe ich ... . Vielen Dank. Klar, er ersetzt zwar, findet allerdings wieder Buchstaben von dem HTML-Code und ersetzt unendlich lange. Somit bringt es auch nichts, den Memory hochzudrehen.

Vielen Dank für eure Antworten!
Boecki91
Ehemaliges Teammitglied
Beiträge: 4744
Registriert: 18.06.2006 15:21

Beitrag von Boecki91 »

Wenn du das Limit auf 600M hochstellst stößt du aber auch irgendwo an Grenzen ;) Irgendwann hast du keinen RAM Riegel mehr frei ;)
Standart: Am besten mit beiden Beinen auf dem Boden
Standardmäßig antworte ich nicht auf PMs
Antworten

Zurück zu „Coding & Technik“