PDA

View Full Version : [JAVA/SQL]Errore "Memory Exhausted" quando genero un script SQL enorme!!! help...


doctorAle85
23-10-2009, 11:37
Su eclipse sto generando uno script SQL enorme ... e ad un certo punto mi da l'errore "memory exausthed near..." ...me lo da intorno alla 10000esima riga!!!
Non si tratta di un errore Java Heap Space (out of memory) il quale anche lui era comparso, ma l'ho risolto settando in run configurations l'argomento -Xmx1200m.
Ora nn so dove mettere le mani perchè online nn ho trovato nulla che facesse al mio caso!
ps Ho 2gb di ram

:muro:

ally
23-10-2009, 11:50
Su eclipse sto generando uno script SQL enorme ... e ad un certo punto mi da l'errore "memory exausthed near..." ...me lo da intorno alla 10000esima riga!!!
Non si tratta di un errore Java Heap Space (out of memory) il quale anche lui era comparso, ma l'ho risolto settando in run configurations l'argomento -Xmx1200m.
Ora nn so dove mettere le mani perchè online nn ho trovato nulla che facesse al mio caso!
ps Ho 2gb di ram

:muro:

...altre strade? tipo lo spezzare il tutto in piu' elementi?...

...ciao Andrea...

doctorAle85
23-10-2009, 12:11
...altre strade? tipo lo spezzare il tutto in piu' elementi?...

...ciao Andrea...

...devo restituire una stringa che rappresenta lo script SQL tutto insieme, non a pezzi!
...hai qualche suggerimento?
Attualmente utilizzo uno StringBuffer per creare lo script e da problemi...con uno StringBuilder idem!!!:mc:

Ho letto qualcosa online sulla documentazione di eclipse ganymede e sembra sia un problema di buffer di memoria!

che ne dici?

euphyllia87
23-10-2009, 12:33
Memory Exhausted è un errore tipico delle Virtual Machine... e/o di interpreti di linguaggi interpretati (penso si sia capito).

Memoria Esaurita? Bene... quanto è lunga la tua stringa? Quanti BIT va ad occupare?

doctorAle85
23-10-2009, 12:35
Memory Exhausted è un errore tipico delle Virtual Machine... e/o di interpreti di linguaggi interpretati (penso si sia capito).

Memoria Esaurita? Bene... quanto è lunga la tua stringa? Quanti BIT va ad occupare?

non ti so dire... so solo che l'errore l'ha generato intorno alla 10000esima riga dello script!

Cmq la memoria della JVM l'ho aumentata fino a 1,2gb!

euphyllia87
23-10-2009, 12:36
non ti so dire... so solo che l'errore l'ha generato intorno alla 10000esima riga dello script!

Del sorgente... non è uno script.
Ok, generato intorno a quella i-esima riga. Va bene; cosa c'è a quella riga? Prima e dopo? Incolla un pò di codice va...:D

Inoltre... tu puoi avere anche 2GB di memoria ram... ma se invii una stringa che in bit supera quella lunghezza, lui te la tronca... o in questo caso, Memory Exhausted!

doctorAle85
23-10-2009, 12:38
x Ally...

Ho provato a "spezzare la stringa"...invece di restituire una stringa enorme ho restituito un Set<String> e poi da questo ho ricorstruito la stringa finale, ma non va...sempre quell'errore mi da!:muro: :muro: :muro: :muro:

doctorAle85
23-10-2009, 12:42
Del sorgente... non è uno script.
Ok, generato intorno a quella i-esima riga. Va bene; cosa c'è a quella riga? Prima e dopo? Incolla un pò di codice va...:D

Inoltre... tu puoi avere anche 2GB di memoria ram... ma se invii una stringa che in bit supera quella lunghezza, lui te la tronca... o in questo caso, Memory Exhausted!


la 10000esima riga non è di sorgente!!!!!!...è dello script e ne sono sicuro!

Considera che ho fatto una classe di prova "piccola" e l'errore fatidico si verifica quando faccio questa cosa:
String script=generationScript(...);

ecco l'errore...

........
........
........
UNION DISTINCT
SELECT DISTINCT 'a4', 'b1' FROM U alias_0 , U alias_1 , S alias_2 , R alias_3 WHERE alias_0.term2=alias_1.term1 AND alias_1.term2='b1' AND alias_1.term1=alias_2.term1 AND alias_2.term1=alias_2.term2 AND alias_3.term1='a4'
UNION DISTINCT
SELECT DISTINCT 'a4', 'b1' FROM T alias_0 , U alias_1 , U alias_2 , R alias_3 WHERE alias_0.term1=alias_0.term2 AND alias_0.term2=alias_1.term2 AND alias_1.term2=alias_2.term1 AND alias_2.term2='b1' AND alias_3.term1='a4' >: memory exhausted near ' U alias_2 , U alias_3 , T alias_4 , R alias_5 WHERE alias_0.term2=alias_1.term1' at line 10663

banryu79
23-10-2009, 12:43
x Ally...

Ho provato a "spezzare la stringa"...invece di restituire una stringa enorme ho restituito un Set<String> e poi da questo ho ricorstruito la stringa finale, ma non va...sempre quell'errore mi da!:muro: :muro: :muro: :muro:
Riempire tutto solo fino alla 9.900 riga e farsi stampare la memoria?

euphyllia87
23-10-2009, 12:45
la 10000esima riga non è di sorgente!!!!!!...è dello script e ne sono sicuro!

Considera che ho fatto una classe di prova "piccola" e l'errore fatidico si verifica quando faccio questa cosa:
String script=generationScript(...);

ecco l'errore...

........
........
........
UNION DISTINCT
SELECT DISTINCT 'a4', 'b1' FROM U alias_0 , U alias_1 , S alias_2 , R alias_3 WHERE alias_0.term2=alias_1.term1 AND alias_1.term2='b1' AND alias_1.term1=alias_2.term1 AND alias_2.term1=alias_2.term2 AND alias_3.term1='a4'
UNION DISTINCT
SELECT DISTINCT 'a4', 'b1' FROM T alias_0 , U alias_1 , U alias_2 , R alias_3 WHERE alias_0.term1=alias_0.term2 AND alias_0.term2=alias_1.term2 AND alias_1.term2=alias_2.term1 AND alias_2.term2='b1' AND alias_3.term1='a4' >: memory exhausted near ' U alias_2 , U alias_3 , T alias_4 , R alias_5 WHERE alias_0.term2=alias_1.term1' at line 10663


Intendevi la riga sql... allora.
Non vorrei far confusione tra sorgente java e sorgente sql. Script non ne vedo ;)

Mi sa che stia andando in un infinite loop di mysql...

doctorAle85
23-10-2009, 12:48
Intendevi la riga sql... allora.
Non vorrei far confusione tra sorgente java e sorgente sql. Script non ne vedo ;)

Mi sa che stia andando in un infinite loop di mysql...

per script intendo la stringa sql che poi deve essere eseguita!
...quella in rosso nell'errore per esempio io la considero una parte dello script!

doctorAle85
23-10-2009, 12:51
Riempire tutto solo fino alla 9.900 riga e farsi stampare la memoria?

come faccio a contare il numero di righe della stringa?
...e per stampare la memoria?

euphyllia87
23-10-2009, 12:52
per script intendo la stringa sql che poi deve essere eseguita!
...quella in rosso nell'errore per esempio io la considero una parte dello script!

Tecnicamente è una parte di sorgente SQL... gli script sono altre cose! L'importante è capirci. Una sola cosa...

tu mi hai riportato l'errore che l'engine mysql ti stampa a video; ma la riga d'errore? ;) li c'è un near ' U alias_2 , U alias_3 , T alias_4 , R alias_5 WHERE alias_0.term2=alias_1.term1' at line 10663 ' ma io non lo vedo nel codice... SQL.

Vado a pranzo, dopo vedo di risponderti e aiutarti :Prrr:

banryu79
23-10-2009, 12:53
come faccio a contare il numero di righe della stringa?
...e per stampare la memoria?
No lascia, avevo capito un altra cosa finch'è non hai postato il messaggio di errore che ricevi a runtime: quell'errore a occhio capita proprio in fase di esecuzione della query SQL lanciata sul database.

Non c'entra con il sorgente Java, cioè non sembra essere un errore della JVM.

doctorAle85
23-10-2009, 13:08
Tecnicamente è una parte di sorgente SQL... gli script sono altre cose! L'importante è capirci. Una sola cosa...

tu mi hai riportato l'errore che l'engine mysql ti stampa a video; ma la riga d'errore? ;) li c'è un near ' U alias_2 , U alias_3 , T alias_4 , R alias_5 WHERE alias_0.term2=alias_1.term1' at line 10663 ' ma io non lo vedo nel codice... SQL.

Vado a pranzo, dopo vedo di risponderti e aiutarti :Prrr:

ti pare facile beccare la riga d'errore... :D
nella console di eclipse inizia a scorrere a manetta e non ce la faccio a bloccare dove sta l'errore! rimedi?

No lascia, avevo capito un altra cosa finch'è non hai postato il messaggio di errore che ricevi a runtime: quell'errore a occhio capita proprio in fase di esecuzione della query SQL lanciata sul database.

Non c'entra con il sorgente Java, cioè non sembra essere un errore della JVM.

Allora...c'è qualche notizia!...nn so se positiva o negativa!!!

Praticamente nel metodo che va a creare lo "script" viene utilizzato uno StringBuffer...
Ho smanettato qualcosa e ho impostato questo parametro:
buf.ensureCapacity(1000000000);
Ora nn da più il problema di Memory Exhausted, ma da di nuovo il problema out of memory... eppure in run configurations ho impostato 1500mb!!!
come cacchio è possibile!!!

Altra cosa curiosa...
Se utilizzo un metodo già implementato in questo progetto, che genera ed esegue questo script tutto insieme (senza restituire un resultset ma un'altra cosa) non mi da alcun problema!!!

Se separo le cose, generazione ed esecuzione invece da questi problemi!



2a cosa...
Ho fatto la stampa di una cavolata, ad esempio "true", alla fine della creazione della stringa SQL, per vedere se il problema si verifica durante o dopo la creazione della stringa!
...bene, la stringa sql viene generata senza problemi, perchè mi stampa "true" dopo aver creato lo script...subito dopo però (che corrisponde al momento dell'esecuzione della query sql) da il problema!

Quindi Ally, hai quasi sicuramente ragione!!!
cosa si può fare? impostare qualche parametro in MySql?

euphyllia87
23-10-2009, 13:15
ti pare facile beccare la riga d'errore... :D
nella console di eclipse inizia a scorrere a manetta e non ce la faccio a bloccare dove sta l'errore! rimedi?



Allora...c'è qualche notizia!...nn so se positiva o negativa!!!

Praticamente nel metodo che va a creare lo "script" viene utilizzato uno StringBuffer...
Ho smanettato qualcosa e ho impostato questo parametro:
buf.ensureCapacity(1000000000);
Ora nn da più il problema di Memory Exhausted, ma da di nuovo il problema out of memory... eppure in run configurations ho impostato 1500mb!!!
come cacchio è possibile!!!

Altra cosa curiosa...
Se utilizzo un metodo già implementato in questo progetto, che genera ed esegue questo script tutto insieme (senza restituire un resultset ma un'altra cosa) non mi da alcun problema!!!

Se separo le cose, generazione ed esecuzione invece da questi problemi!



2a cosa...
Ho fatto la stampa di una cavolata, ad esempio "true", alla fine della creazione della stringa SQL, per vedere se il problema si verifica durante o dopo la creazione della stringa!
...bene, la stringa sql viene generata senza problemi, perchè mi stampa "true" dopo aver creato lo script...subito dopo però (che corrisponde al momento dell'esecuzione della query sql) da il problema!

Quindi Ally, hai quasi sicuramente ragione!!!
cosa si può fare? impostare qualche parametro in MySql?

Come detto da me ed Ally è un problema di esecuzione della Query SQL.
L'unica cosa che mi viene da pensare è 'frammentare' la query sql ed eseguirla a blocchi.

ally
23-10-2009, 13:33
...ma ricapitolando...crei una query talmente lunga e complessa da occupare 1GB di ram?!...

...ciao Andrea...

doctorAle85
23-10-2009, 13:39
scusate, ma ho confuso un pò i vostri nomi nei messaggi che ho scritto... :D

Ho invocato il metodo length() sulla stringa SQL mi restituisce questo numero:
3072229

E' tanto?

euphyllia87
23-10-2009, 13:39
...ma ricapitolando...crei una query talmente lunga e complessa da occupare 1GB di ram?!...

...ciao Andrea...

No. Probabilmente l'esecuzione della query va in loop ed occupa tutta la memoria...

doctorAle85
23-10-2009, 13:52
No. Probabilmente l'esecuzione della query va in loop ed occupa tutta la memoria...

Scusa...ma com'è possibile che se utilizzo un metodo che restituisce un resultset che genera lo script e lo valuta al suo interno va bene...
...invece se separo le 2 cose (generazione ed esecuzione) da questi problemi!!!
mistero...

ally
23-10-2009, 13:54
No. Probabilmente l'esecuzione della query va in loop ed occupa tutta la memoria...

...quindi è l'esecuione a dar problemi...la soluzione è semplice...la query va rivista...il problema passa da java a sql...

...ciao Andrea...

doctorAle85
23-10-2009, 13:58
Ragazzi...forse ho risolto!!!

Avevo formulato una query a caso molto complessa e lunga...probabilmente ho inserito qualche termine che generava veramente un loop!!!
...ho cambiato la query, facendola anche più complicata, ma allo stesso tempo provando a cambiare qualche termine di quella precedente e ora va alla grande!!!
...evidentemente c'era qualcosa che nn permetteva di terminare l'esecuzione...

euphyllia87
23-10-2009, 14:08
Ragazzi...forse ho risolto!!!

Avevo formulato una query a caso molto complessa e lunga...probabilmente ho inserito qualche termine che generava veramente un loop!!!
...ho cambiato la query, facendola anche più complicata, ma allo stesso tempo provando a cambiare qualche termine di quella precedente e ora va alla grande!!!
...evidentemente c'era qualcosa che nn permetteva di terminare l'esecuzione...

Rispondendo alla domanda di prima: non lo so il perché! O meglio non posso saperlo non avendo il problema sotto mano.

Per quanto riguarda la soluzione... era sicuramente un Loop di MySQL... va in out of memory per evitare di far crashare tutto quanto :) (un po come il timeout di qualsiasi web server)

doctorAle85
23-10-2009, 14:27
grazie ;)