2016-03-22 18 views
1

ハイバネートクエリの結果からCSVを生成しようとしていますが、最大200k行を含むことができ、作成されたCSVは約30MBです。オブジェクトリストからCSVを生成

私はパフォーマンスを何か近くで受け入れるのに苦労しています。 現在、私の休止状態のクエリは、オブジェクトのリストを返します。 次に、StringBuilderを使用してCSV文字列を生成します。 それからバイト配列を取得し、バイト配列をresponse.outputstream.write()メソッドに渡します。

このサイズのCSVを効率的に生成するにはどうすればよいですか?

マイサービス

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; 

私のコントローラは[]

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

はストリーミングを使用しています。メモリに膨大なファイルを作成してからストリームしないでください。それをデータベースからあなたの応答に直接ストリームしてください。スーパーCSVはかなり速いです –

答えて

0

結果のバイトを取得する問題は、最初にStringBuilder拡大にように見える、あなたは文字の大きな数を割り当てるために、それを初期化することができ書き込みしようとしているコンテンツの長さがInteger.MAX_VALUE(最大長はchar[])になり、バッファオーバーフローエラーが発生する可能性があります。

個々に書き込んでいる値にカンマや引用符をエスケープする可能性のある問題もあります。これは扱いにくく、正しい出力が得られるようにCSVライブラリを使用することをお勧めします。

uniVocity-parsersを使用してオブジェクトを永続化してください。いくつかの注釈を使用して、特定のフィールドをCSVにシリアル化することができます。

免責事項:私はこのライブラリの作者であり、オープンソースで無料(Apache 2.0ライセンス)です。

関連する問題