2012-03-23 6 views
0

私はいくつかのエントリをダウンロードすると、私のcsvファイルのダウンロードはうまくいっているアプリケーションがあります...しかし、たくさんのエントリがある場合、Java例外がありますデバッグすると、vmdisconnected例外が発生します。私はファイルをダウンロードする際のヒープスペース例外

String content = service.generateCSV(SearchVO); 

という名前の変数内のすべてのデータを取得しようとしています このコンテンツ変数はアクションクラスに設定してから私は、このコンテンツ変数を取得していたにするDownloadServletクラスを持っています。

String content = (String) request.getAttribute(CONTENT); 

は、誰もがどのように私はそれは多くの多くのエントリ

これは私がデータベースからデータを取得していますどのようにしている場合でも、ファイルをダウンロードできるような方法でコンテンツを読むために私をお勧めできます

`while (sqlRowSet.next()) 
     { 
    data = (DB2Xml) sqlRowSet.getObject(Constants.TABLE_NAME_XML); 
    dl = data.getDB2XmlString();} 

スタックトレース: -

java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOfRange(Unknown Source) 
at java.lang.String.<init>(Unknown Source) 
at java.lang.StringBuffer.toString(Unknown Source) 
at com.ibm.db2.jcc.c.fc.getDB2XmlString(fc.java:187) 
+1

Javaの例外を投稿してください。 – barsju

+0

もっとコードを入力してください。いくつかの助けが必要な場合は、あなたのコードなどをフォーマットしてください。http://stackoverflow.com/faq#howtoask –

+0

私はあなたが大きなメモリに1つのメモリブロックに格納されていますbeleave。より多くのコードと例外スタックトレースを提供する。 –

答えて

0

あなたはヒープ領域が不足している場合は、あなたがそれを増やす必要があります。ここで は、一般的な間違いを避けるためにそれを行うとどのようにする方法については素敵な読み取りです:

http://javahowto.blogspot.com/2006/06/6-common-errors-in-setting-java-heap.html大まか

+0

@barsju ....投稿のために感謝...しかし、それは私が望むものではありません... – rcky

0

が話しを、あなたは、データのストリームを使用して、というよりも、メモリへのデータのすべてを置くことに向かって移動したいです一度。

service.generateCSVContentは巨大な文字列を生成し、スタックトレースからはこれがDB2データベースから来ているように見えますか? 2分の検索から、stream-based APIがあるように見えます。多分あなたの問題を解決するのに役立ちます。コンテンツ全体を変数に入れるのではなく、AとBの間でコンテンツをストリーミングする必要があります。

+0

....ここではA&Bとは何ですか...私は検索結果に同じデータベースクエリを使用しているため、dbを混乱させたくありません – rcky

+0

おそらくデータベースです。データベースからデータをストリームとして取得します(一度にすべてではなく、レコードごとに記録するなど)。 Bは、相手側で何をしているのか(たとえば、CSVファイルの生成)です。一度にすべてではなく、行ごとに生成します。 –

1

あなたの問題は、メモリ内で一度に使用するには大きすぎるソースを処理しようとしているようです。

この問題を解決する方法の1つは、すべてを1回ではなく、徐々に(たとえば1行ごとに)ソースを読み取って(データを処理する)ことができます。

これはURLからファイルを読み取る方法の例徐々に(ラインごと)と、別のファイルにコピーです。

  URL url; 
      try { 
       url = new URL(location); 
       BufferedReader in = new BufferedReader(
           new InputStreamReader(url.openStream())); 
       BufferedWriter out = new BufferedWriter(new FileWriter(saveFile)); 
       String buffer; 
       while ((buffer = in.readLine()) != null) { 
        out.write(buffer); 
        // write the file or do whatever you want with it 

       } 
       in.close(); 
       out.close(); 

      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
関連する問題