2017-04-03 19 views
1

dataTableから新しいワークシートを追加する必要があります。私はClosedXMLを使用して、このタスクのために:クローズドXML。メモリリーク中にWorkbook.Save()

workbook.Worksheets.Add(dataTable); 
workbook.Save(); 
workbook = new XLWorkbook(filePath); //reload file to avoid exception at next saving 

私のプロセスは、128 MBのメモリを使用しますがWorkbook.Save()後、この数は382メガビットに発祥しています。私は、次のワークシートのメモリ使用量を464Mbから619Mbに増やした後に追加しました。しかし、実際のファイルは1.6 Mbでした。

この理由は何ですか?

答えて

1

ClosedXMLの最新バージョン(この段階ではv0.87)にアップグレードしてください。 Release構成でコードを実行し、XLWorkbookに配置した後、次のコードを追加します。

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 

あなたはメモリが戻っ許容レベルまで低下していることに気づくはずです。

3

XLWorkbookIDisposableは、保持するリソースをすべて解放する必要があります。これをしないと、インスタンスがガベージコレクションされたときにのみ解放されます(XLWorkbookが適切なファイナライザを実装していると仮定します)。あなたはこのようにそれを実行する必要があります。もちろん

workbook.Save(); 
workbook.Dispose(); // < important 
workbook = new XLWorkbook(filePath); 

良くusingステートメントにworkbookを包むか、少なくとも例外のリリースを確保するためにtryfinallyを使用することで、それは直接質問に関連はないでしょう。

+1

アプリケーションを 'Debug'コンフィグレーションで実行すると(通常は最適化がオフであることを意味する)、期待されたときに破棄されたオブジェクトが実際に破棄されるという保証はありません。これらのオブジェクトは通常、デバッガで表示できるように保持されています。 'Release'設定に切り替えて、破棄されたオブジェクトが期待どおりにガベージコレクションされるようにします。 –

関連する問題