Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-04-2007, 14:12   #1
satoshi2005
Senior Member
 
L'Avatar di satoshi2005
 
Iscritto dal: Mar 2005
Città: Ticino, Svizzera
Messaggi: 431
[Java] Problema transazioni

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

Ultima modifica di satoshi2005 : 06-04-2007 alle 14:17.
satoshi2005 è offline   Rispondi citando il messaggio o parte di esso
Old 06-04-2007, 16:12   #2
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
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
Old 06-04-2007, 17:26   #3
satoshi2005
Senior Member
 
L'Avatar di satoshi2005
 
Iscritto dal: Mar 2005
Città: Ticino, Svizzera
Messaggi: 431
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
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
No, la connessione la apre una sola volta..
satoshi2005 è offline   Rispondi citando il messaggio o parte di esso
Old 06-04-2007, 18:05   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Prova a lanciare l'applicazione con -Xaprof. Del genere:

java -Xaprof pippo.Main > profile.txt

nel profilo troverai un elenco delle classi create, del numero di istanze e di quanta memoria queste occupano (per categoria). Per dirla breve, alla fine vedi chi si pappa tutta 'sta memoria.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2007, 06:01   #5
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da satoshi2005 Guarda i messaggi
.Ovviamente per inserire 27'000 records l'uso delle transazioni è*¯vvio.
Perche'? Secondo me dipende da quanto vuoi fare, e secondo me non hai problemi di integrita' dei dati se non le usi. E' solo un'opinione, ovviamente, ma potresti darci un'occhiata...

In questi casi, da bravo pilota, mi preparo una checklist da seguire:
1 - Hai provato a fare il commit() record per record e vedere cosa succede? Facendo una sola commit(), probabilmente l'area di rollback e' cresciuta un pochino...
2 - Sei sicuro di aprire e chiudere gli Statement? Tutti gli Statement?
3 - Sei sicuro che il problema non sia il parser? Se stai usando DOM, per questa applicazione, potrebbe essere benissimo lui...
4 - Hai provato con i suggerimenti di PGI-Bis?
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2007, 08:19   #6
satoshi2005
Senior Member
 
L'Avatar di satoshi2005
 
Iscritto dal: Mar 2005
Città: Ticino, Svizzera
Messaggi: 431
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Perche'? Secondo me dipende da quanto vuoi fare, e secondo me non hai problemi di integrita' dei dati se non le usi. E' solo un'opinione, ovviamente, ma potresti darci un'occhiata...

In questi casi, da bravo pilota, mi preparo una checklist da seguire:
1 - Hai provato a fare il commit() record per record e vedere cosa succede? Facendo una sola commit(), probabilmente l'area di rollback e' cresciuta un pochino...
2 - Sei sicuro di aprire e chiudere gli Statement? Tutti gli Statement?
3 - Sei sicuro che il problema non sia il parser? Se stai usando DOM, per questa applicazione, potrebbe essere benissimo lui...
4 - Hai provato con i suggerimenti di PGI-Bis?
Con le transazioni ci metti molto di meno.. E non vorrei che l'utente debbe aspettare troppo!

1. Si, con l'autocommit si crasha lo stesso
2. Ecco cosa ho dimenticato! Ahahah
3. Com'è possibile che sia lui se la stringa più grande che gestisce è di 7Mb?
4. Devo ancora provare, ma penso che mi hai già risolto il problema!

Grazie mille! Sato
satoshi2005 è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2007, 08:57   #7
satoshi2005
Senior Member
 
L'Avatar di satoshi2005
 
Iscritto dal: Mar 2005
Città: Ticino, Svizzera
Messaggi: 431
Devo rifare tutto! Mi si è rotto l'hard-disk! NOOOOOOOOOOOOOOO
satoshi2005 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2007, 08:05   #8
satoshi2005
Senior Member
 
L'Avatar di satoshi2005
 
Iscritto dal: Mar 2005
Città: Ticino, Svizzera
Messaggi: 431
Ok ho rifatto tutto, il problema era appunto perché non chiudevo gli statements (e nemmeno i resultset), dunque grazie!
Ora però ho un altro problema..
Se metto:
Codice:
	Class.forName("com.mysql.jdbc.Driver");
	db = DriverManager.getConnection("jdbc:mysql://127.0.0.1/satoepg", Main.db_username , Main.db_password);
	db.setAutoCommit(false);
	palimpsest = new Palimpsest();
	palimpsest.updateDays();
	db.commit();
	db.close();
Ci mette tanto quanto:
Codice:
	Class.forName("com.mysql.jdbc.Driver");
	db = DriverManager.getConnection("jdbc:mysql://127.0.0.1/satoepg", Main.db_username , Main.db_password);
	db.setAutoCommit(true);
	palimpsest = new Palimpsest();
	palimpsest.updateDays();
	db.close();
(sempre tra i 15 e i 20 secondi ad inserire 7'500 dati).. non è normale no?

Grazie, sato

edit: Vi ricordo: La connessione che usa per fare qualsiasi query è sempre la stessa (è static), quindi faccio sempre "Main.db.prepareStatement(...)"
satoshi2005 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2007, 10:17   #9
Angus
Senior Member
 
L'Avatar di Angus
 
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
Quote:
Originariamente inviato da satoshi2005 Guarda i messaggi
Ok ho rifatto tutto, il problema era appunto perché non chiudevo gli statements (e nemmeno i resultset), dunque grazie!
Ora però ho un altro problema..
Se metto:
Codice:
	Class.forName("com.mysql.jdbc.Driver");
	db = DriverManager.getConnection("jdbc:mysql://127.0.0.1/satoepg", Main.db_username , Main.db_password);
	db.setAutoCommit(false);
	palimpsest = new Palimpsest();
	palimpsest.updateDays();
	db.commit();
	db.close();
Ci mette tanto quanto:
Codice:
	Class.forName("com.mysql.jdbc.Driver");
	db = DriverManager.getConnection("jdbc:mysql://127.0.0.1/satoepg", Main.db_username , Main.db_password);
	db.setAutoCommit(true);
	palimpsest = new Palimpsest();
	palimpsest.updateDays();
	db.close();
(sempre tra i 15 e i 20 secondi ad inserire 7'500 dati).. non è normale no?

Grazie, sato

edit: Vi ricordo: La connessione che usa per fare qualsiasi query è sempre la stessa (è static), quindi faccio sempre "Main.db.prepareStatement(...)"
Prova a chiudere solo i ResultSet e a riutilizzare la PreparedStatement (se non lo facessi già ). Prendi in considerazione anche l'utilizzo di addBatch().
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer
°SetiEmperor°| Ninja Technologies
{ qualunque cosa sia, è veloce e fa male (cit.) }

Ultima modifica di Angus : 18-04-2007 alle 10:19.
Angus è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
La Camera USA presenta il conto: i data ...
Non solo EV, ma anche IA: Panasonic inau...
iPhone Duo, il debutto del pieghevole di...
Atlas 960E SuperPoD, la risposta di Huaw...
IA militare e nucleare: esperti USA e ci...
Dieci mini-reattori nucleari in Europa d...
CONTROL Resonant su PC: Path Tracing, Ra...
ColorOS 17 arriva su circa 90 dispositiv...
GTA VI, il multiplayer potrebbe debuttar...
Aggiornamento KB5002914 rompe Excel: ecc...
Processo Huawei a Brooklyn: l'FBI mostra...
WhatsApp introduce nuovi temi per le cha...
NVIDIA, Google e Emerald AI uniscono le ...
iPhone 18 Pro Max, il test sulla vapor c...
Fine estate in giardino: le proposte sco...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:29.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v