2016-05-24 83 views
0

我正在使用iTextSharp創建pdf。我有10萬條記錄,但我得到以下異常:itextsharp.dll中發生類型'System.OutOfMemoryException'的異常,但未在用戶代碼中處理

類型「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

十萬= 100000.意味着100000行和40列。每個單元格包含約20個字符的數據。我的系統有8 GB RAM。 – Sachin

+0

什麼是lakh?我從未聽過這個詞。 –

回答

1

的給你對內存消耗所提供的數據的存儲器需求包絡計算的背給出100000 * 40 *(2 * 20 + 4)= 167MBs。在你的記憶範圍內,但它只是一個下界。我想象每個Cell對象都很大。如果每個單元會有512字節的開銷,那麼您可能會考慮採用2GB。我認爲這可能更多,因爲PDF是一個複雜的野獸。

因此,您可能實際上正在考慮一種情況,即您實際上內存不足。如果不是你的電腦,那麼至少C#已經爲自己的事情留出了空間。

我會先做一件事 - 檢查內存消耗如here。你甚至可以試着用10,100,1000,10000,100000行來查看,直到程序運行多少行。

你也許可以嘗試完全不同的事情。如果你想用很多數據打印格式良好的表格,也許你可以輸出一個HTML文檔,這個文檔可以逐步完成,你可以通過將東西寫入文件來完成,而不是使用第三方庫。然後您可以將該HTML文檔「打印」爲PDF。 StackOverflow到rescue再次出現此問題。

+0

這不是Java而是.NET,因此您可能需要修改答案。 –

+0

@AmedeeVanGasse oops,這是一個有趣的錯誤。感謝您指出。我將建議改爲C#。像以前一樣,這不是一個解決方案,而是一些調查途徑,可能有助於薩欽。 –

相關問題