как избежать » Системы.Исключение OutOfMemoryException» Объединение большого количества PDF-файлов с помощью iTextSharp в asp.net mvc c#

#c# #asp.net-mvc #pdf #itext #out-of-memory

Вопрос:

Я объединяю большое количество PDF-файлов с помощью iTextSharp в asp.net mvc c#, он отлично работает для небольшого количества файлов, но когда он достигает примерно (1000) файлов, он прерывается в строке pdf.addDocument(считыватель); и система бросков.Исключение из памяти». Я уже использую PdfCopy и FileStream, чтобы лучше использовать память, которая предлагается везде, где я искал. Мой код приведен ниже. Пожалуйста, подскажите мне, как с этим справиться.

         using (FileStream stream = new FileStream(outMergeFile, FileMode.Create))
        {
            Document document = new Document();
            PdfCopy pdf = new PdfCopy(document, stream);
            PdfReader reader = null;
            PdfReader.unethicalreading = true;
            try
            {
                document.Open();
                for (int i = 0; i < fileList.Count; i  )
                {
                    var fileStr = Request.MapPath(fileList[i].Path)                            
                    reader = new PdfReader(fileStr);
                        
                    pdf.AddDocument(reader);
                    reader.Close();
                }
            }
            catch (Exception ex)
            {
                reader.Close();
            }
            finally
            {
                document.Close();
            }
        }
 

Комментарии:

1. Вы используете IIS в 32-разрядной или 64-разрядной версии?

2. спасибо за ваш быстрый ответ, я использую IIS в 64-разрядной версии.

3. Либо улучшите свою реализацию, либо добавьте больше оперативной памяти, обойти это невозможно.

4. Ваш код не совсем корректен. Document, PdfCopy, PdfReader являются одноразовыми предметами. У них должны быть using показания. Все они должны быть внутри for петли, а не снаружи.

5. @KosalaW в случае itext Dispose и Close , по сути, сделайте то же самое, и операция попытается закрыться. Таким образом, их не нужно использовать using . Но это определенно было бы хорошим стилем.

Ответ №1:

Добавить

 pdf.FreeReader(reader);
 

прямо перед

 reader.Close();
 

чтобы убедиться, что для управления скопированным содержимым из него требуется как можно меньше памяти reader .

Этот метод (родительского класса PdfCopy ) документируется как Запись считывателя в документ и освобождение используемой им памяти. Основное применение-при объединении нескольких документов, чтобы ограничить использование памяти текущим добавляемым документом.