Newsgroup: it.comp.java
Titolo: [JVM] Out of memory in windows: modificando il codice si può risolvere?

Ciao a tutti,
(spero di non essere OT, e scusate per la lunghezza del post!) la mia
questione riguarda un software specifico open-source (Weka), scritto
in Java, che viene utilizzato per clustering & classificazione di dati
in formato arff o csv (oltre che DB): il mio problema non nasce
dall'utilizzo del software "in sè", ma da un problema con la JVM sotto
Windows (e ti pareva...). Scrivo qui perchè probabilmente dovrò fare
delle modifiche al sorgente.
Nonostante abbia dovuto aumentare le dimensioni dell'heap (mediante la
direttiva al compilatore
-Xmx1000m
), sembra che ciò non sia sufficente: date le dimensioni notevoli dei
dataset che sto dando in ingresso alla "macchina", mi viene fuori un
"Out of memory error" sul quale si blocca l'elaborazione e si chiude
il programma, salvo avvisarmi che è necessaria (credo) più memoria
heap (ho "solo" 1 GB di RAM)
Questo mi porta - arrivo al punto - a pensare che sia necessario
intervenire sul codice per adattarlo alle mie esigenze, e poi
ricompilare tutto ... questo perchè ho letto "in giro" sul web che
esiste un "modulo" di windows (SP2) che impedisce alla JVM di allocare
"troppa" memoria consecutiva, il che deduco sia la causa dei miei
problemi.
1) Per quanto riguarda la modifica del codice, è sufficente inserire
nel codice sorgente delle chiamate a
System.gc()
per tentare di liberare un po' di memoria, quando possibile? Cosa
altro posso fare per gestire la memoria "a mano" (nei limiti del
possibile, ovviamente)?
2) Secondo voi Linux, a parità di computer, potrebbe offrire
prestazioni migliori in termini di possibilità di allocare "tanto"
heap?
Vi ringrazio anticipatamente, come sempre, per la/e risposta/e :)
--

 heap?
Linux si può ottimizzare perché usi molta meno ram, per cui quella che 
risparmi è tutta guadagnata.
Dipende anche dalla versione di java: fino alla 1.4 ho notato che a 
parità di codice tende leggermente a occupare più ram, ma non ho mai 
approfondito la cosa.
Buon lavoro,
Paolo


Ti ringrazio molto per la tua risposta, Paolo.
Il problema è più che altro che non è banale decidere in che punto del
codice intervenire, o meglio
su quale classe che utilizzerò, visto che si tratta di un metodo
sperimentale per cui non si può
sapere quale dei metodi vada ottimizzato (scusa se mi esprimo in modo
un po' contorto!)
Piuttosto sarei tentato dal provare la 1.6di Java, che suppongo
(rispetto alla 1.4) consumi un po'
meno RAM: inoltre proverò a fare come suggerisci (aumentare la memoria
iniziale piuttosto che la massima)
Ciao e grazie ancora!

 heap?
Non credo.
Comunque l'occupazione di piu' di 1 GB di memoria non e' segno che il
programma abbia dei problemi o che non sia ottimizzato. Tutto dipende
da cosa fa il programma, che algoritmi usa e che input riceve (e si
aspetta di ricevere).
Mi spiego meglio: se ad un programma che calcola il prodotto tra
matrici gli do in input due matrici dense enormi, quello utilizzera'
molta memoria.
Se te pensi che la soluzione del problema non dovrebbe necessiare
tanta memoria, allora puo' darsi che ci sia un bug nel software.
Oppure puo darsi che il programma non sia stato pensato per essere
utilizzato con file di input molto grandi.
Comunque credo che avrai miglior fortuna rivolgendo le tue domande sul
forum del progetto (se disponibile) o scrivendo al supporto/
sviluppatori.
Saluti,
The Librarian

 The Librarian
In effetti è improbabile che ci siano bug da correggere nel codice:
gli algoritmi
che vengono eseguiti (che poi sono di data-mining) richiedono "di per
sè"
una grossa quantità di memoria, è quello il problema.
Quello che cercavo di capire è se effettivamente "alleggerire"
esplicitamente
la memoria potrebbe aiutare: ma a pensarci bene, queste "utilità"
dovrebbero
essere giàincluse in un codice che viene sviluppato da anni e che
riguarda
un software consolidato nel settore... dovrò fare diversamente mi sa.
Grazie della consulenza Librarian (proverò a chiedere nel forum di
Weka)

 writes:
s> il mio problema non nasce dall'utilizzo del software "in
s> sè", ma da un problema con la JVM sotto Windows (e ti
s> pareva...). Scrivo qui perchè probabilmente dovrò fare delle
s> modifiche al sorgente.
Scusa, ma quanta memoria virtuale hai dato alla macchina ?
-- 
 /\           ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
  //--\| | \|  |   Integralista GNUslamico
\/                 e coltivatore diretto di Software
A Cesare avrei detto di scrivermi a 
fn...@rat.vg

Ho impostato l'allocazione automatica della VM (con quellamanuale non
funziona comunque)
Come dicevo prima, nel mio caso dipende molto dalla dimensione elevata
dei dati in input
(che infatti sto pensando di partizionare secondo qualche criterio)
Grazie dell'interessamento :)
Gian Uberto Lauri ha scritto:


 writes:
s> Come dicevo prima, nel mio caso dipende molto dalla dimensione
s> elevata dei dati in input (che infatti sto pensando di partizionare
s> secondo qualche criterio)
Ci  stavo pensando  sotto la  doccia, ricordandomi  delle  tecniche di
parallelizzazione.
Divide et impera.


 --
Credo che sia una buona pensata:
parallelismo e/o divide et impera
grazie del suggerimento (anche perchè potrebbe diventare il mio tema
di ricerca :) )
Thanx
(cmq "Coltivatore Diretto di Software ed Integralista GNUslamico" è da
Oscar :D )

 parallelismo e/o divide et impera
normalmente se fai il divide et impera allora hai gia' per default il
parallelismo.
Ciao Jack