2012-12-31 2 views
2

큰 레코드 세트 (1M 레코드 약)를 읽는 중 SqlDataReader이 있는데 iTextSharp를 사용하여 PDF 문서로 내보내려고합니다. iTextSharp - 매우 큰 테이블 메모리 누수

if (reader.HasRows) 
{ 
    int rowNum = 0; 
    while (reader.Read()) 
    { 
     if (rowNum % 2 == 1) 
      datatable.DefaultCell.GrayFill = 0.8f; 
     else 
      datatable.DefaultCell.GrayFill = 0.95f; 
     if (meRes.Trans(Lang, "Dir", CompanyID).ToUpper() == "RTL") 
      for (int i = reader.FieldCount - 1; i >= 0; i--) 
      { 
      object o = reader[i]; 
      datatable.AddCell(new Phrase(o.ToString(), fntList)); 
      } 
     else 
      for (int i = 0; i < reader.FieldCount; i++) 
      { 
       object o = reader[i]; 
       datatable.AddCell(new Phrase(o.ToString(), fntList)); 
      } 
     rowNum++; 
    } 
    myDocument.Add(datatable); 
} 

나는이 실행

, 그것은 끔찍한 메모리 누수의 원인 : 이 내 코드입니다. 개선하려면 어떻게해야합니까?

+0

에게 감소 페이지 당 행의 수를 설정할 수있다'. 그게 문제가 될 수있다 –

+0

만약 내가'datatable.AddCell (new Phrase (reader [i], fntList));'을 수행 중이라면 이것이 문제라고 생각하지 않는다. 여전히 메모리 누출을 야기한다. – ronen

+0

데이터를 데이터의 메모리 내 표현 인 datatable로 내 보냅니다. 귀하의 mydocument.Add (datatable)까지 모든 것을 메모리에 축적. 누수가없고, 단지 나쁜 디자인입니다. – mkl

답변

1

당신은 '오브젝트 O = 리더 [I]과 같은 조건에서 모든 루프 객체를 생성, 메모리 압력

if (rowNum>0 && table1.Rows.Count % 7 == 0) // 7 = number of rows per page 
{ 
    pdfDoc.Add(table1); 
    table1.DeleteBodyRows(); // free resources 
    pdfDoc.NewPage(); 
} 
+0

감사합니다. 좋은데, 큰 공백을 막기 위해 테이블을 추가 한 후에 같은 페이지에 얼마나 많은 공간이 남아 있는지 알 수있는 방법이 있습니까? – ronen

+0

pdfDoc.Add (table1) 다음에는 테이블의 높이 값에 액세스 할 수 있습니다. 페이지 크기와 여백을 줄이면 빈 공간의 높이를 계산할 수 있습니다. – VahidN