2016-05-24 10 views
0

nicht bearbeitet. Ich verwende iTextSharp, um PDF zu erstellen. Ich habe 100k Aufzeichnungen, aber ich bin immer folgende Ausnahme:Eine Ausnahme vom Typ 'System.OutOfMemoryException' ist in itextsharp.dll aufgetreten, wurde aber im Benutzercode

eine Ausnahme vom Typ ‚System.OutOfMemoryException‘ aufgetreten in itextsharp.dll wurde aber nicht in Benutzercode in der Zeile behandelt: bodyTable.AddCell (currentProperty .GetValue (lst, null) .ToString());

-Code ist:

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

Ein Stack-Trace wäre nützlich. Wie groß ist die Datenmenge? Ein Lakh == 10000 richtig? Aber wie groß ist jede Platte? Wie viel Speicher hat das System insgesamt? Vielleicht ist es ein echter Fall, dass der Computer keinen Speicher mehr hat. –

+0

ein Lakh = 100000. Bedeutet 100000 Zeilen und 40 Spalten. Jede Zelle enthält ca. 20 Zeichendaten. Mein System hat 8 GB RAM. – Sachin

+0

Was ist ein Lakh? Ich habe dieses Wort noch nie gehört. –

Antwort

1

A Rückseite des Umschlags Berechnung der Speicherplatzbedarf der Daten gegeben Sie für den Speicherverbrauch zur Verfügung gestellt gibt 100000 * 40 * (2 * 20 + 4) = 167MBs. Gut innerhalb Ihrer Speichergrenze, aber es ist nur eine Untergrenze. Ich kann mir vorstellen, dass jedes Cell-Objekt ziemlich groß ist. Wenn jede Zelle einen 512-Byte-Overhead haben würde, könnten Sie gut 2GB genommen betrachten. Ich denke, es könnte sogar noch mehr sein, da PDF ein komplexes Biest ist.

Sie könnten also realistischerweise eine Situation betrachten, in der Ihnen tatsächlich der Speicher ausgeht. Wenn nicht Ihre Computer, dann hat zumindest das Bit C# für sein eigenes Ding reserviert.

Ich würde zuerst eine Sache tun - überprüfen Speicherverbrauch wie here. Sie können es sogar mit 10, 100, 1000, 10000, 100000 Zeilen versuchen und sehen, bis zu welcher Anzahl von Zeilen das Programm funktioniert.

Sie könnten vielleicht etwas ganz anderes ausprobieren. Wenn Sie versuchen, eine schön formatierte Tabelle mit vielen Daten zu drucken, könnten Sie vielleicht ein HTML-Dokument ausgeben, das inkrementell ausgeführt werden kann und das Sie einfach durch Schreiben von Daten in eine Datei erstellen können, anstatt eine Bibliothek eines Drittanbieters zu verwenden . Sie können dann das HTML-Dokument in PDF "drucken". StackOverflow zum rescue wieder mit diesem Problem.

+0

Es ist nicht Java, sondern .NET, also möchten Sie vielleicht Ihre Antwort ändern. –

+0

@AmedeeVanGasse oops, das ist ein lustiger Fehler zu machen. Danke, dass du es aufgezeigt hast. Ich habe die Vorschläge in C# geändert. Wie zuvor ist es keine Lösung, sondern eher ein Weg zur Untersuchung, der Sachin helfen könnte. –

Verwandte Themen