View Single Post
Old 06-04-2007, 17:12   #2
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Quote:
Originariamente inviato da satoshi2005 Guarda i messaggi
Salve gente,
Ho un problema con un progetto che sto realizzando.
Il programma dovrebbe scaricare un file XML di circa 7Mb da internet, contenente tutti i programmi che vanno in onda su S*y da oggi ai prossimi 7 giorni. Poi dovrebbe parsarlo e inserire i dati nel database (sono circa 27'000 records).

Ovviamente per inserire 27'000 records l'uso delle transazioni è ovvio. Il problema è che non appena faccio partire il programma, lui scarica il file da internet (e fin lì non ha problemi), poi non appena inizia con il parsing, la CPU sale (ovviamente) e la RAM sale costantemente fino a raggiungere un errore "java.lang.OutOfMemoryError: Java heap space". Prima di far partire il programma la RAM occupata è circa 530Mb. Facendo partire il programma sale fino a circa 1Gb, dopodiché dà errore (perché ho 1Gb di RAM). Il processo che occupa la RAM è mysql.
Ora, con le transazioni le query vengono salvate in memoria e inserite nel db non appena riceve il "commit". Ma com'è possibile che le transazioni occupano 500Mb di memoria quando il file prima di essere parsato è solo 7Mb??

Vi allego una parte di codice che magari potrebbe aiutarvi..

Codice:
public class Main
{
 public static Palimpsest palimpsest;
 public static Connection db;
 protected static String  db_username = "username";
 protected static String  db_password = ""; 
 public static void main(String[] args)
 {
  try
  {
   Class.forName("com.mysql.jdbc.Driver");
   db = DriverManager.getConnection("jdbc:mysql://127.0.0.1/database", Main.db_username , Main.db_password);
   db.setAutoCommit(false);
   palimpsest = new Palimpsest();
   palimpsest.updateDays();
   db.commit();
   db.close();
  } catch (Exception e)
  {
   e.printStackTrace ();
  }
 }
Il DB è fatto nel seguente modo:
  • Tabella day: date (INT 11), clearDate (VARCHAR 28, p.es. Friday, April 6 2007)
  • Tabella category: id (INT 1), date (INT 11) (relazionato con day.date), shortName (VARCHAR 15), name (VARCHAR 30)
  • Tabella channel: id (INT 4), id_category (INT 1) (relazionato con category.id), date_category (INT 11) (relazionato con category.date), name (VARCHAR 32)
  • Tabella program: id (INT 8), time (INT 11), id_channel (INT 4) (relazionato con channel.id), genre (VARCHAR 64), name (VARCHAR 128), image (VARCHAR 128), description (TEXT)
La connessione che usa per fare qualsiasi query è sempre la stessa (è static), quindi faccio sempre "Main.db.prepareStatement(...)"

Qualcuno può aiutarmi?
Grazie, sato
Non è ke apri una sessione al DB x ogni riga del file da caricare?
Altrimenti non mi spiego proprio come fai ad usare 500 MB di ram
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso