2016-03-22 19 views
1

Ich versuche, eine CSV aus den Ergebnissen einer Hibernate-Abfrage zu generieren, es könnte bis zu 200.000 Zeilen enthalten, und wenn erstellt, könnte die CSV etwa 30 MB sein.CSV aus einer Liste von Objekten generieren

Ich kämpfe um die Leistung alles in der Nähe akzeptabel. Momentan gibt meine Hibernate-Abfrage eine Liste von Objekten zurück. Ich verwende dann einen StringBuilder, um eine CSV-Zeichenfolge zu generieren. Dann bekomme ich ein Byte-Array von diesem, und übergeben Sie das Byte-Array in response.outputstream.write() -Methode.

Was soll ich tun, um eine CSV dieser Größe effizient zu generieren?

Mein Service

List<Object> objectList = hibernateDao.getObjectList(objectList); 

    StringBuilder sb = new StringBuilder(); 
    sb.append("field1_id,field2,field3,field14"); 
    for(Object object : objectList){ 
     sb.append("\n"); 
     sb.append(object.field1()); 
     sb.append(","); 
     sb.append(object.field2()); 
     sb.append(","); 
     sb.append(object.field3()); 
     ... 
     ... 
     sb.append(","); 
     sb.append(object.field14); 
    } 
    byte[] bytes = sb.toString().getBytes(); 
    return bytes; 

My-Controller werden die resultierenden Bytes erhalten []

response.setHeader("Content-Type", "text/comma-separated-values"); 
response.getOutputStream().write(objectService.getListByteArray()); 
+0

Nutzung durch den ganzen Weg Streaming. Erstellen Sie keine große Datei im Speicher und streamen Sie sie. streamen Sie es direkt von der Datenbank zu Ihrer Antwort. super csv ist ziemlich schnell –

Antwort

0

Das Problem zunächst auf Ihrem StringBuilder erweitert zu sein scheint, können Sie es initialisieren könnte große Anzahl von Zeichen zu vergeben aber dann die Länge des Inhalts, den Sie versuchen zu schreiben, gehen möglicherweise über Integer.MAX_VALUE (die maximale Länge von char[]) und Sie werden einen Pufferüberlauffehler erhalten.

Es gibt auch das potenzielle Problem, Kommas und Anführungszeichen in den Werten, die Sie einzeln schreiben, zu vermeiden. Dies ist schwierig zu handhaben und ich empfehle Ihnen, eine CSV-Bibliothek zu verwenden, um sicherzustellen, dass Sie die richtige Ausgabe erhalten.

Versuchen Sie uniVocity-parsers, um Ihre Objekte zu erhalten. Sie können einige Anmerkungen verwenden, um bestimmte Felder in CSV zu serialisieren.

Disclaimer: Ich der Autor dieser Bibliothek bin, dann ist es Open Source und kostenlos (Apache 2.0 Lizenz)

Verwandte Themen