Newsgroup: it.comp.www.php
Titolo: problemi di memoria

Salve,
vi espongo il mio problema.
Ho una pagina php che legge un file di dati e lo mette in memoria. Finora ha 
sempre funzionato ma, da ieri mi d� questo errore:
allowed memory size of 16777216 bytes exhausted (tried to allocate 16 bytes
Premesso che non ho apportato nessuna modifica al codice...
Premesso che il server non � mio...
Premesso che l'errore lo d� alla riga: $arc[$x1][$x2][$x3]=ord(fread($fp, 
1));
cosa posso fare?
Si tratta di un problema di server?
Grazie
<?php
$x1=0;
$x2=0;
$x3=1;
$ultima=0;
$fp = fopen("../archivio.dat", 'r');
while (!feof($fp))
 {
 $x1++;
 if($x1>5000)
  {
  $x1=1;
  $x2++;
  if($x2>10)
   {
   $x2=0;
   $x3++;
   }
  }
 $arc[$x1][$x2][$x3]=ord(fread($fp, 1));
}
for($y1=1;$y1<5001;$y1=$y1+1)
 {
 for($y2=0;$y2<11;$y2=$y2+1)
  {
  for($y3=1;$y3<6;$y3=$y3+1)
   {
   $ciccio1=$arc[$y1][1][1];
   $ciccio2=$arc[$y1][2][1];
   if(($ciccio1=="") AND ($ciccio2==""))
    {
    if($ultima==0)
     {
     $ultima=$y1 - 1;
     }
    }
   }
  }
 }
?>
-- 
...
distinti saluti,
Salvatore Paci 

 cosa posso fare?
modificare il parametro di configurazione memory_limit
http://it2.php.net/manual/en/ini.core.php
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
Every government is a parliament of whores. The trouble is, in a
democracy, the whores are us.
    --P. J. O'Rourke

 luigi
Premesso che ho premesso che il server non � mio... come posso modificare 
questo parametro?
Inoltre... se finora ha sempre funzionato... cosa vuol dire? Che hanno 
modificato di recente i parametri del server?
Grazie
Salvatore Paci

 modificato di recente i parametri del server?
Vuol dire che sono cambiate le condizioni: o il file e' piu' grosso, o il
programma occupa piu' memoria, o la memoria e' diminuita o il parametro e' stato
modificato, o...
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
Alexander Graham Bell is alive and well in New York,
and still waiting for a dial tone.

 modificato, o...
----------
A questo punto credo che sia diminuita la memoria del server. Il file � 
identico e lo script pure.
Se qualcuno ha un suggerimento...
Ciao a tutti
Salvatore Paci 

 Grazie
-----------------
Mi viene da formulare una domanda: se il file che apro � grande solamente 
269Kb... (e lo carico in memoria una solta volta) come mai viene superato il 
limite di 16Mb? 

 
Immagino che l'array si ingrandisca piï¿œ di 16 mb (magari perchï¿œ prendi 
un intero al posto del carattere (ergo 4 byte al posto di 1)), anche se 
non nascondo che mi pare strano lo stesso...
Enrico

Si tratta di un problema di server?
Direi di si'. Tiro a indovinare: hanno aggiornato la versione di PHP e
usano una versione meno "multidimensional array friendly".
Io proverei a... non usare un array.
<?php
	$archivio = file_get_contents('../archivio.dat');
	$ultima	  = floor(filesize('../archivio.dat') / 5000);
	// Dopodiche' invece di usare
	$arc[$x1][$x2][$x3];
	// usi
	ord(substr($archivio, $x1+$x2*5000+($x3-1)*55000, 1));
?>
Potrei aver fatto casino con l'ordine dei parametri e con i numeri, ad
esempio 5000 anziche' 5001 o 4999, e 55000 = 5000*11 anziche' 12 o 10.
Il tempo che impiega PHP a risolvere l'array 3-D e' piu' di quello che
ci impiega a fare le moltiplicazioni e l'ord().
Leonardo IHHO
-- 
Linten addie toorin addie,
Linten addie toorin ee,
Linten lowrin lowrin lowrin,
The barnyards of Delgaty

 
certo e' un obrobio lo cicli piu di 5000 volte sto coso
$file = file_get_contents("../archivio.dat");
se hai 5000 righe (dipende dalla length)
fai un explode su \r\n (dipende dal tuo modo di andare a capo win / lin)
in caso fai un echo senza mettere nell'array se non devi usarlo
occumpa - memoria php


 Enrico
---------
Vorrei provarci.
Come faccio a prendere il dato come carattere?
Ciao 

 ?>
E come faccio - ad esempio - a prendere il valore di $arc[1][10][5] ???
Ciao e grazie 

 occumpa - memoria php
-------------
Si tratta di un file binario.
Ciao 

E come faccio - ad esempio - a prendere il valore di $arc[1][10][5] ???
ord(substr($archivio, 1+10*5000+(5-1)*55000, 1)));
...se ho dieci minuti mi genero un file di archivio con contenuto random e
controllo di aver azzeccato la formula giusta :-)
Questo sistema DOVREBBE farti consumare al piu' due volte la lunghezza del
file di archivio (quindi, diciamo, 520 Kb). Oltre a tutto il resto, dovuto
allo script, si capisce.
Leonardo


ord(substr($archivio, 1+10*5000+(5-1)*55000, 1)));
Dimenticavo, se hai proprio 1 10 5, nessuno ti impedisce di scrivere gia'
la "soluzione":
	ord(substr($archivio, 270001, 1));


 ord(substr($archivio, 1+10*5000+(5-1)*55000, 1)));
-------------
Nel mio sito ho la pagina leggi archivio (che � quella che ho allegato 
prima) che viene utilizzata da tutte le altre pagine (sono centinaia).
Le altre pagine accedono all'array che � in memoria e lavorano.
Purtroppo sono costretto a creare un array a tre dimensioni ed a usarlo.
Il mio sito � in ginocchio da due giorni ed il server su cui � in hosting 
non mi permette di poter scegliere tra php4 e php5.
sob sob 

Purtroppo sono costretto a creare un array a tre dimensioni ed a usarlo.
Allora quella funzione secondo me fa proprio al caso tuo.
Sostituisci arc[a][b][c] con getarc(a,b,c) e definisci la funzione getarc
in modo che legga l'archivio e lo renda disponibile.
	function getarc(a, b, c)
	{
		GLOBAL $archivio;
		if (!isset($archivio))
		{
			// Legge archivio da file
		}
		return ord(substr($archivio, $a + $b * 5000 + ($c-1) *
55000, 1));
	}
Ci sono vari tool per il "global replacement".
