06-04-2007, 17:12
|
#2
|
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
Originariamente inviato da satoshi2005
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
__________________
|
|
|