2012-03-22 13 views
0

検索機能を使用して、検索ボタンを使用してエンティティのすべてのレコードをユーザーに返すようになりました。今度はレコードの量に関係なく(今は50,000を検索できます記録)。今私は、レコード.IF csvファイル内のすべてのこれらのレコードをダウンロードしようとしています少ない、そのが正常に動作しますが、その3万人以上、それはサーブレットがJavaヒープスペース例外をスローするダウンロード

編集投げているとき: -

ソリューション: - これらを使用しますその代わりのメモリストリングのコピーで巨人を作り、その後メモリバッファに巨人にすべてを書くのコード

  InputStream in = new ByteArrayInputStream(buffer.toString().getBytes("UTF-8")); 
      ServletOutputStream out = response.getOutputStream(); 

      byte[] outputByte = new byte[4096]; 

      while(in.read(outputByte, 0, 4096) != -1) 
       { 
        out.write(outputByte, 0, 4096); 
        } 
     in.close(); 
      out.flush(); 
       out.close();*/ 
+0

[スレッド "メイン" java.lang.OutOfMemoryErrorの例外:Javaヒープスペース](http://stackoverflow.com/questions/2381849/exception-in-thread-main-java-lang-outofmemoryerror- java-heap-space) –

+0

すべてのメモリを使用すると、そのエラーが発生します。 –

答えて

2

のライン、あなたのHttpServletResponseからWriterを取得し、あなたがそれを作成すると、クライアントに直接CSVを書きます。こうすることで、データをクライアントに送ってクライアントに送ることができ、全体を送信する前に2つのコピー全体をRAMに保存する必要はありません。

もちろん、ヒープを大きくすることもできます。

+0

@Affe ...どのようにそれを行うかの実践的な例? – rcky

+0

単にgenerateCSVのシグネチャを変更してWriterを取り込み、それを渡してからAppendableを実装するので、バッファを置き換えるためにあまり変更する必要はありません。 toString(); – Affe

+0

@Affe ... rrorのjava.lang.OutOfMemoryErrorを、この種の取得:Javaヒープスペース \t java.util.Arrays.copyOf(不明なソース) \t java.lang.StringValue.from(不明なソース) \tのjava。 lang.String。 (不明なソース) 私はHttpServletResponseのオブジェクトを作成し、そのオブジェクトを使用して私はライターを得て、それからすべてを追加しました....そしてそれをフラッシュしました – rcky

1

メモリ内にすべてバッファリングするのではなく、ソケット上でレコードをストリーミングすることを検討する必要があります。それはおそらく、あなたは、csvを生成するコードにOutputStreamを渡す必要があります。

メモリを増やしてサーバーを稼働させることもできますが、これは本当に良い答えではありません.OOM例外を別の日に延期するだけだからです。

+0

@ Bill ..あなたはそれを詳述できます。 – rcky

+0

Affeが言ったように、彼または彼女はほぼ同じ時間に投稿しました。 ;-) – Bill

関連する問題