0

Apache POI を使用して、5000 行を超える行と 10 を超えるワークシートを含む Excel ファイルから読み取ろうとしています。すべての列と行の値を取得して ArrayListMultiMap> に格納すると、このロジックは完全に正常に機能し、これを格納しますこのような VelocityContext のオブジェクト:

       VelocityContext context = new VelocityContext();
        context.put("excelMap", excelMap);

このコレクションを速度テンプレートで使用して、excelMap を反復処理して XML ファイルに値を入力する必要があります。

     VelocityEngine vEngine = new VelocityEngine();
    vEngine.setProperty("resource.loader", "class");
    vEngine.setProperty("class.resource.loader.class",  "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
    Template t = vEngine.getTemplate(vmTemplate);
    **StringWriter sw = new StringWriter(excelMap.size());**
    **t.merge(context,sw)**

ただし、StringWriter の容量は常に 1024 であり、既に PrintWriter を BufferedWriter、StringBuilderWriter と組み合わせて試していると、アプリケーションがマージ行に到達するとハングし、最後に OutOfMemory 例外が表示されます。

誰でも私を助けてもらえますか、私はすでに StringWriter と PrintWriter に関連するすべての投稿を準備していますが、うまくいきません。

ありがとうございました

4

1 に答える 1

0

1024の限定はニシンです。そのため、メモリエラーが発生していません。Writer が初期容量を超えると、より多くのメモリが割り当てられます。あなたの本当の問題は、Velocity ではなく、スプレッドシートとデータです。

StringWriter javadoc から:

initialSize -自動的に展開される前にこのバッファーに収まる char 値の数(私の強調)

スプレッドシート全体をメモリに読み込む代わりに、一度に 1 つのワークシートまたは 1 つのエントリを XML に変換してみてください。Velocity が最良の選択ではない可能性があります。

于 2015-04-15T11:19:54.900 に答える