2

非常に巨大なジャスパーレポート(約20000ページ)をエクスポートしています。その目的のために、さまざまなWebサイトで提案されているように、メモリ不足エラーを回避するために、以下に示すようにJRSwapFileVirtualizeを使用しています。

virtualizer = new JRSwapFileVirtualizer(1000, new JRSwapFile(reportFilePath, 2048, 1024), true);
parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
.
.
JasperPrint print = JasperFillManager.fillReport(report, parameters, list);
virtualizer.cleanup();

私の質問は次のとおりです。

1)maxSizeを1000に設定しました。20000ページのレポートで問題ありませんか?

2)メソッド呼び出し'fillReport'の直後にバーチャライザーをクリーンアップしています。レポートをXLSにエクスポートした後、それは正しいですか、それともバーチャライザーをクリーンアップする必要がありますか?

3)とにかく、レポートをエクスポートした後にバーチャライザーをクリーンアップすることは役に立ちますか?

4)JasperPrintオブジェクトを作成し、ロジックはサーバー側で記述されます。レポートロジックのエクスポートは、Javaクライアントで記述されています。レポートをエクスポートした後、仮想化機能をクリーンアップすることになっている場合、このシナリオをどのように処理しますか?この場合、サーバー側でこのバーチャライザーの静的オブジェクトを作成する必要があるため(JRSwapFileVirtualizerはシリアル化できないため、サーバーとクライアント間で作成して渡すことができないため)、エクスポート後にサーバー側のメソッドを呼び出してクリーンアップする必要がありますバーチャライザー。サーバー側のロジックに対して複数の呼び出しが行われると、virtualizer静的オブジェクトが最新の呼び出しによって作成されたスワップファイルへの参照を保持し、クリーンアップ後に以前のスワップファイルが削除されない可能性があるため、静的オブジェクトの作成はリスクだと考えていました。

このトピックに関する詳細情報を見つけました。ジャスパーが仮想化を使用するために提供したサンプルでは、​​複数の種類のファイルをエクスポートするcommon exportを呼び出す場合にのみ、仮想化をクリーンアップしています。単一のタイプのレポートのみをエクスポートする場合、クリーンアップを呼び出していません。

else if (TASK_CSV.equals(taskName))
{
    exportCSV(jasperPrint);
}       
else if (TASK_EXPORT.equals(taskName))
{
    exportPDF(jasperPrint);
    exportXML(jasperPrint, false);
    exportHTML(jasperPrint);
    exportCSV(jasperPrint);

    // manually cleaning up
    virtualizer.cleanup();
}

また、この例ではXLSエクスポートについて言及していません。その人が同じ問題に直面している別のリンクを見つけましたが、解決策も言及されていません:

http://www.jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=95689

また、このリンクは、代わりにJRXlsxExporterを使用できることを示しています。ただし、JRXlsxExporterは、2003年ではなく2007年形式のみをエクスポートします。

JExcelApiExporter.exportReport()を使用してレポートをXLSにエクスポートしていますが、巨大なレポートの場合は機能しません。この問題を解決するのを手伝ってください。小さなヒントや提案はかなりあります。さらに詳しい情報が必要な場合はお知らせください。ありがとう。

4

2 に答える 2

1

OK..fillReport を適用すると、すべてのデータセット (レコード) が jvm (ヒープ領域) に保持され、任意の形式にエクスポートするときにエクスポーターによって使用されます。

ここで、データセットのサイズが jvm のサイズよりも大きくなると、 outOfMemeryError でハングアップするため、 jvm memory を利用する代わりに、virtualizer(FileVirtualizer & swapfile) を使用すると、これらのデータセットをファイルに保存できます (最終的にはシリアル化を使用してデータセットを保存します)。ファイルへ)。

記事について : レポートの入力中に使用されるのは正しいです : したがって、入力中 (fillReport の呼び出し中) に、即時アクセスが必要なオブジェクトをメモリに保存し、バーチャライザーを使用してファイルに残します。そのため、残りのレコードにアクセスしようとすると (ページネーションのエクスポーター オプションを使用)、JasperPrint はファイルからレコードを取得し、必要に応じて未使用のページをスワップします。

ここでは、JRFileVirtualizer JRSwapFileVirtualizer についてのみ説明しています。JRGzipVirtualizer の場合、ストレージはメモリ内ですが圧縮形式になります。ディスクに直接アクセスできない場合に使用されます。

于 2012-08-08T08:51:31.657 に答える
1

1.最初の質問については、レポート生成アプリに指定したヒープ サイズに大きく依存します。試行錯誤のシナリオを試すと、正確なサイズが得られます

あなたの2番目の質問のために

2.最初のコード スニペットによると、レポートを入力し、すぐにバーチャライザーにクリーンアップを適用しています。したがって、レポートを作成した場合でも、クリーンアップ後にスワップ ファイルが破棄され、データが削除されます。-- レポート データの使用が完了したことを確認したら、バーチャライザーでクリーンアップを適用する必要があります。したがって、この場合、特定の形式にエクスポートした後です。

3.クリーンアップは、スワップファイルをすぐに破棄することです。そのため、エクスポート後にレポートを再利用しない場合は、クリーンアップを適用することをお勧めします。注: 明示的にクリーンアップしなくても、jasperPrint の廃棄時にガベージ コレクターによって破棄されます。

あなたの4番目のポイントは私には非常に不明確です.jasperPrintがサーバー側で作成されていると言っています....そしてエクスポートロジックはクライアント側で書かれています... JasperPrintへの参照なしでどのようにエクスポートロジックがクライアント側にあるのかisonサーバー側....??1!!

于 2012-08-06T05:13:34.510 に答える