2016-03-20 4 views
1

Я пишу небольшой инструмент для слияния PDF-файлов с использованием библиотеки PDFSharp. Я использую последнюю предварительную версию (1.5) PDFSharp.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); 
} 

Примером может быть у меня есть 10 документов в формате PDF, которая насчитывает на 178 Мб. Созданный объединенный документ также составляет около 178 Мб. Когда вышеприведенный код заканчивает выполнение использования памяти, он занимает 356 Мб. Когда я объединять больше документов, эта утечка памяти продолжает расти и в конечном итоге вызывает крушение.

Я попытался удалить с помощью операторов и использовать Dispose(), когда захочу, чтобы документ был выпущен из памяти, однако он не работает.

Любая помощь будет оценена по достоинству. Спасибо.

Edit:

Чтобы быть более точным:

 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)); 
        } 
       } 
      } 
     } 
    } 
}