Newsgroup: it.comp.java
Titolo: Java 1.5 lento a scrivere da Arraylist di array di stringhe a file

Ciao,
ho un problema di performance, ho memorizzato un Arraylist<[] String>,
devo prendere ogni elemento- array di stringhe, lo converto in record
separato da virgole - ed inserirlo in un file di testo.
Le performance sono di circa 1000 record/minuto, vorrei sapere se
esiste qualche modo per migliorarle.
Questo è un estratto del codice:
// INZIO CODICE
Stirng outputRecord;
for(int i=0;i<recordsToAdjust.size();i++){
	outputRecord=UtilBase.toCsvRecord(recordsToAdjust.get(i), separator);
	UtilBase.writeString(fileName, outputRecord + "\r\n", true);
	adjRecord=adjRecord+1;
}
//alternativa ma performance identiche
for(String[] myToWriteRecord:recordsToAdjust){
	outputRecord=UtilBase.toCsvRecord(myToWriteRecord, separator);
	UtilBase.writeString(fileName, outputRecord + "\r\n", true);
	adjRecord=adjRecord+1;
}
//FINE CODICE
Avete qualche consiglio ?
grazie mille,
Ale

 [...snip...]
Il problema è di certo nella classe UtilBase; possiamo vederla?

> Il problema è di certo nella classe UtilBase; possiamo vederla?
Ciao,
intanto grazie per la tua disponibilità.
Volevo aggiungere che in un'altra sezione del codice, le performance sono 
migliori (10.000 record/minuto) ed in tal caso leggo un file CSV e per ogni 
record memorizzo i campi in un ArrayList<<classeCampi> e poi prendo ogni 
elemento (ossia un campo del record) e lo inserisco in un array di stringhe 
che converto in record separato da virgole e quindi metto in un txt di 
output.
Comunque, riporto le funzioni della Utilbase:
//INIZIO CODICE
public static void writeString(String sPathAndFile, String sToWrite, boolean 
bAppend){
FileWriter outputFile = null;
try {
if (sPathAndFile == null)
System.out.println("Attenzione, il nome del file in input e' null. Non e' 
possibile creare il file");
if (sToWrite == null) {
System.out.println("Attenzione, la stringa passata in input e' vuota. Verra' 
creato un file vuoto");
}
outputFile = new FileWriter(sPathAndFile, bAppend);
outputFile.write(sToWrite);
} catch (Throwable e) {
System.out.println("Attenzione, errore nella creazione del file " + 
sPathAndFile + " con il contenuto della stringa passata come parametro. 
Eccezione: " + e);
}
finally {
try {
if(outputFile != null)
outputFile.close();
} catch (Exception ee) {
System.out.println("Attenzione, non e' possibile chiudere il file " + 
sPathAndFile + ". Eccezione: " + ee);
}
}
}
//FINE CODICE
Grazie ancora,
Alessandro

 Comunque, riporto le funzioni della Utilbase:
 > [...snip...]
Ci sono un po' di cose su cui lavorare; purtroppo la pincipale richiede 
una modifica all'archiettura: il problema principale è che per ogni riga 
il file viene aperto e richiuso e queste sono operazioni piuttosto 
onerose. Quindi ti consigliere di scrivere una classe che mantiene lo 
stato del file una volta aperto (non puoi riciclare UtilBase così com'è 
perché sembra orientata a metodi di utilità statici, mentre 
quest'operazione deve avere un'istanza per scrittura).
Poi la concatenazione di stringhe con il + è moooolto onerosa; se la 
vedi all'interno di un ciclo è quasi di sicuro un errore: o usi uno 
StringBuffer o, nel tuo caso, fai due scritture separate sul file.
Infine, a parte l'apri/chiudi del file, che comunque in alcuni casi è 
inevitabile, se c'è un problema secondo me sta nel metodo toCsvRecord(), 
non in quello che hai postato.
Ciao.


Grazie per l'analisi Spazza ... posto lo stesso la funzione toCsvRecord(), 
magari noti qualcosa di lento (funzione molto semplice comunque):
//START CODE
public static String toCsvRecord(String[] record, String separatore){
String csvRecord=null;
for(String field:record){
if(csvRecord==null)
csvRecord=field;
else
csvRecord=csvRecord + separatore + field;
}
return csvRecord;
}
//END CODE
Se ti viene in mente qualcosa fammi sapere !
Grazie,
Ale