3

ASP.NET MVCアプリケーションでは、NPOIフレームワークを使用して、かなり大きなExcelファイル(30〜100 MB)を生成しています。

http://npoi.codeplex.com/

ドキュメントを生成した後、それをメモリストリームに保存し、MVCファイルヘルパーメソッドを使用してFileStreamResultを返します

File(Stream fileStream, string contentType, string fileDownloadName)

このような

HSSFWorkbook document = GenerateExcelWorkBook();

var stream = new MemoryStream();
document.Write(stream);

stream.Flush();
stream.Position = 0;

return File(stream, "application/vnd.ms-exce", "filename.xls");

可変ドキュメントは、NPOIフレームワークの「HSSFWorkbook」タイプです。

ドキュメントが生成され、ストリームがユーザーに返された後でも、メモリ使用量が高いままである理由がわかりません。Fileメソッドは、応答ストリームに書き込んだ後にストリームを破棄する必要があります。

生成リンクをもう一度クリックすると、メモリ使用量が通常に戻り、ドキュメントが再度生成されるにつれて増加し始めます。

これは、NPOI HSSFWorkbookクラスがガベージコレクションされていないなどの問題でしょうか?私は静的変数を保存していないので、それは奇妙なことです(少なくとも私のコードにはありません)。

メモリ使用量が通常に戻らない理由を誰かが知っていますか?

4

2 に答える 2

6

廃棄!=メモリを解放します。

ガベージコレクタは必要に応じてメモリを解放し、大きなブロックは小さなブロックよりも時間がかかる場合があります。

2番目のドキュメントを生成するときに見られる動作は、私が提案していることを裏付けています。追加のメモリ使用量により、「メモリプレッシャー」が発生し、ガベージコレクションがトリガーされてクリーンアップされます。

基本的に、本当にメモリの問題がない限り、心配する必要はありません。

于 2013-01-04T14:03:49.323 に答える
1

メモリ不足の状況が発生している場合は、GC.Collect()の呼び出しを検討することをお勧めします。このSOスレッドをチェックして、それを呼び出す理由(またはそうでない理由)の適切な説明を確認してください。

GC.Collect()

テストする価値があるかもしれないというだけで、あなたがすべきだと言っているのではありません。

于 2013-01-04T16:46:32.227 に答える