#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
) документируется как Запись считывателя в документ и освобождение используемой им памяти. Основное применение-при объединении нескольких документов, чтобы ограничить использование памяти текущим добавляемым документом.