Generazione di file CSV utilizzando Java

8

Abbiamo un requisito nel nostro progetto per generare un grande file CSV ogni 2 ore utilizzando un programma Java.

Questo file avrà circa 60.000 linee (circa 120 caratteri per riga). Non sono ancora sicuro delle dimensioni.

Vorrei sapere se ho problemi di memoria, perché aprirò il file usando FileWriter e poi continuerò a scrivere e infine chiuderò il file.

Dovrei preoccuparmi delle dimensioni del file? Se sì, ci sono altre buone tecniche per scrivere in un file grande in Java diverso dall'uso di FileWriter?

Stiamo utilizzando Java 5.

    
posta java_mouse 08.05.2012 - 15:34
fonte

4 risposte

14

No, non dovresti. Il punto di un file è di immagazzinare cose al di fuori della memoria ad accesso casuale; la dimensione del FileWriter è costante, e probabilmente è piuttosto piccola, tutto sommato, anche se è un FileWriter bufferizzato. La riscrittura costante potrebbe causare il carico I / O oi picchi della CPU, ma quasi certamente non la mancanza di memoria.

    
risposta data 08.05.2012 - 15:40
fonte
8

Come ha scritto Killian Foth, non dovresti avere alcun problema, 60000 linee non sono poi così grandi. Volevo solo suggerirti di utilizzare uno qualsiasi dei parser CSV gratuiti forniti qui sotto l'iniziativa "Commons CSV" all'indirizzo link anziché scrivere la tua implementazione.

Ho usato Super CSV per alcuni progetti e certamente non ho avuto alcun problema con esso.

    
risposta data 08.05.2012 - 15:51
fonte
5

Non usare FileWriter. Non a causa di problemi di prestazioni (le classi IO di Java non tengono tutto in memoria, le linee 60k ut non sono nulla anche se lo facessero), ma perché non ti permettono di scegliere la codifica dei caratteri. Utilizzerà implicitamente la codifica predefinita della piattaforma, il che significa che il testo esterno all'ASCII può essere danneggiato.

Utilizzare invece un OutputStreamWriter che avvolge un FileOutputStream. O, ancora meglio, una libreria CSV, che dovrebbe gestire tutti questi problemi.

    
risposta data 08.05.2012 - 16:40
fonte
1

Potresti prendere in considerazione l'utilizzo di BufferedWriter, anche se probabilmente questo non aiuterà in modo significativo con le prestazioni, è comunque una buona pratica, dal momento che immagino che il numero di linee non sarà sempre di 60.000.

Hai pensato di zippare il file in seguito? Se hai intenzione di avere un sacco di questi file in giro, potrebbe essere nel tuo interesse comprarlo dopo che è stato scritto, specialmente se creerai questi file una volta ogni due ore.

Per quanto riguarda la memoria, probabilmente non hai nulla di cui preoccuparti se non stai lavorando su un sistema con poca memoria, nel qual caso dovresti usare BufferedWriter e impostare in modo esplicito la dimensione del buffer.

    
risposta data 08.05.2012 - 16:18
fonte

Leggi altre domande sui tag