2016-03-20 41 views
1

私はPDFSharpライブラリを使用してPDFファイルをマージするための小さなツールを自分で作成しています。私はPDFSharpの最新のプレリリース版(1.5)を使用しています。PDFSharpはリソース(メモリリーク)を処理しない

私は、メモリにロードされたドキュメントがスコープ外に出ても解放されないという問題に直面します。このメモリリークをコードの次の部分に追跡しました。

using (var mergedDocument = new PdfDocument()) 
{ 
    for (var i = 0; i < SelectedDocuments.Count; i++) 
    { 
     using (var document = PdfReader.Open(SelectedDocuments[i].FilePath, PdfDocumentOpenMode.Import)) 
     { 
      for (var j = 0; j < document.PageCount; j++) 
      { 
       mergedDocument.AddPage(document.Pages[j]); 
      } 
     } 
    } 
    mergedDocument.Save(savePath); 
} 

たとえば、私は178Mbで合計10のpdfドキュメントを持っています。作成されたマージされたドキュメントも約178 Mbです。上記のコードの実行が終了すると、メモリ使用量は356 Mbになります。より多くのドキュメントをマージすると、このメモリリークは上昇し続け、最終的にはクラッシュを引き起こします。

メモリからドキュメントを解放したい場合、Dispose()を使用して削除してみましたが、うまくいきませんでした。

ご協力いただければ幸いです。ありがとうございました。

編集:

より正確には:

 var parentDirectory = Directory.GetParent(SelectedDocuments[0].FilePath); 
     var savePath = parentDirectory + "\\MergedDocument.pdf"; 

     using (var mergedDocument = new PdfDocument()) 
     { 
      for (var i = 0; i < SelectedDocuments.Count; i++) 
      { 
       using (var document = PdfReader.Open(SelectedDocuments[i].FilePath, PdfDocumentOpenMode.Import)) 
       { 
        for (var j = 0; j < document.PageCount; j++) 
        { 
         mergedDocument.AddPage(document.Pages[j]); 
        } 
       } 
      } 
      mergedDocument.Save(savePath); 
     } 

SelectedDocuments選択したPDFファイルへのファイルパスの束を保持しているリストです。

+0

MCVEを入力してください:http://stackoverflow.com/help/mcve –

+0

あなたはLOHの圧縮を試みたことがありますか? https://msdn.microsoft.com/en-us/library/system.runtime.gcsettings.largeobjectheapcompactionmode(v=vs.110).aspx –

+0

あなたのアプリをプロファイリングして、メモリが解放されていることを確認しましたか? –

答えて

1

私はメモリの問題を回避するために、次のコードを代わりにiTextSharpを使用して終了:

var parentDirectory = Directory.GetParent(SelectedDocuments[0].FilePath); 
var savePath = parentDirectory + "\\MergedDocument.pdf"; 

using (var fs = new FileStream(savePath, FileMode.Create)) 
{ 
    using (var document = new Document()) 
    { 
     using (var pdfCopy = new PdfCopy(document, fs)) 
     { 
      document.Open(); 
      for (var i = 0; i < SelectedDocuments.Count; i++) 
      { 
       using (var pdfReader = new PdfReader(SelectedDocuments[i].FilePath)) 
       { 
        for (var page = 0; page < pdfReader.NumberOfPages;) 
        { 
         pdfCopy.AddPage(pdfCopy.GetImportedPage(pdfReader, ++page)); 
        } 
       } 
      } 
     } 
    } 
} 
関連する問題