2016-05-24 4 views
0

Я использую iTextSharp для создания pdf. У меня есть 100k записей, но я получаю следующее исключение:Исключение типа «System.OutOfMemoryException» произошло в itextsharp.dll, но не обработано в коде пользователя

исключение типа «System.OutOfMemoryException» произошло в itextsharp.dll, но не был обработан в пользовательском коде В строке: bodyTable.AddCell (currentProperty .GetValue (lst, null) .ToString());

Кодекс:

var doc = new Document(pageSize); 

PdfWriter.GetInstance(doc, stream); 
doc.Open(); 

//Get exportable count 
int columns = 0; 

Type currentType = list[0].GetType(); 

//PREPARE HEADER 
//foreach visible columns check if current object has proerpty 
//else search in inner properties 
foreach (var visibleColumn in visibleColumns) 
{ 
    if (currentType.GetProperties().FirstOrDefault(p => p.Name == visibleColumn.Key) != null) 
    { 
     columns++; 
    } 
    else 
    { 
     //check child property objects 
     var childProperties = currentType.GetProperties(); 
     foreach (var prop in childProperties) 
     { 
      if (prop.PropertyType.BaseType == typeof(BaseEntity)) 
      { 
       if (prop.PropertyType.GetProperties().FirstOrDefault(p => p.Name == visibleColumn.Key) != null) 
       { 
        columns++; 
        break; 
       } 
      } 
     } 
    } 
} 


//header 
var headerTable = new PdfPTable(columns); 
headerTable.WidthPercentage = 100f; 

foreach (var visibleColumn in visibleColumns) 
{ 
    if (currentType.GetProperties().FirstOrDefault(p => p.Name == visibleColumn.Key) != null) 
    { 
     //headerTable.AddCell(prop.Name); 
     headerTable.AddCell(visibleColumn.Value); 
    } 
    else 
    { 
     //check child property objects 
     var childProperties = currentType.GetProperties(); 
     foreach (var prop in childProperties) 
     { 
      if (prop.PropertyType.BaseType == typeof(BaseEntity)) 
      { 
       if (prop.PropertyType.GetProperties().FirstOrDefault(p => p.Name == visibleColumn.Key) != null) 
       { 
        //headerTable.AddCell(prop.Name); 
        headerTable.AddCell(visibleColumn.Value); 
        break; 
       } 
      } 
     } 
    } 
} 

doc.Add(headerTable); 

var bodyTable = new PdfPTable(columns); 
bodyTable.Complete = false; 
bodyTable.WidthPercentage = 100f; 

//PREPARE DATA 
foreach (var lst in list) 
{ 
    int col = 1; 
    foreach (var visibleColumn in visibleColumns) 
    { 
     var currentProperty = currentType.GetProperties().FirstOrDefault(p => p.Name == visibleColumn.Key); 
     if (currentProperty != null) 
     { 
      if (currentProperty.GetValue(lst, null) != null) 
       bodyTable.AddCell(currentProperty.GetValue(lst, null).ToString()); 
      else 
       bodyTable.AddCell(string.Empty); 

      col++; 
     } 
     else 
     { 
      //check child property objects 
      var childProperties = currentType.GetProperties().Where(p => p.PropertyType.BaseType == typeof(BaseEntity)); 
      foreach (var prop in childProperties) 
      { 
       currentProperty = prop.PropertyType.GetProperties().FirstOrDefault(p => p.Name == visibleColumn.Key); 
       if (currentProperty != null) 
       { 
        var currentPropertyObjectValue = prop.GetValue(lst, null); 
        if (currentPropertyObjectValue != null) 
        { 
         bodyTable.AddCell(currentProperty.GetValue(currentPropertyObjectValue, null).ToString()); 
        } 
        else 
        { 
         bodyTable.AddCell(string.Empty); 
        } 
        break; 
       } 
      } 
     } 
    } 
} 

doc.Add(bodyTable); 

doc.Close(); 
+0

Трассировка стека была бы полезна. Кроме того, каков размер данных. Один лак == 10000 право? Но насколько велика каждая запись? Сколько памяти имеет система в целом? Возможно, это настоящий случай, когда компьютер исчерпал память. –

+0

one lakh = 100000. Значит 100000 строк и 40 столбцов. Каждая ячейка содержит около 20 символов. Моя система имеет 8 ГБ оперативной памяти. – Sachin

+0

Что такое лак? Я никогда не слышал этого слова раньше. –

ответ

1

Спинка конверта расчета требований к памяти данных данные, которые были указаны для потребления памяти дает 100000 * 40 * (2 * 20 + 4) = 167MBs. Ну, в пределах вашей памяти, но это только нижняя граница. Я предполагаю, что каждый объект Cell довольно большой. Если в каждой ячейке будет 512 байт, вы можете хорошо смотреть на 2 ГБ. Я считаю, что это может быть даже больше, поскольку PDF - это сложный зверь.

Таким образом, вы можете реально взглянуть на ситуацию, когда на самом деле у вас заканчивается память. Если не ваши компьютеры, то, по крайней мере, бит C# отложил для своей цели.

Я сделал бы одна вещь сначала - проверьте память потребление как here. Возможно, вам даже будет полезно попробовать 10, 100, 1000, 10000, 100000 строк и посмотреть, до какого количества строк работает программа.

Возможно, вы можете попробовать совсем другое. Если вы пытаетесь напечатать красиво отформатированную таблицу с большим количеством данных, возможно, вы можете вывести HTML-документ, который можно сделать постепенно и который вы можете сделать, просто записав материал в файл, а не используя стороннюю библиотеку , Затем вы можете «распечатать» этот HTML-документ в PDF. StackOverflow к rescue снова с этой проблемой.

+0

Это не Java, а .NET, поэтому вы можете изменить свой ответ. –

+0

@AmedeeVanGasse, это смешная ошибка. Спасибо, что указали это. Я изменил предложения на C#. Как и раньше, это не решение, а скорее некоторые возможности для расследования, которые могут помочь Сачину. –