【发布时间】:2012-12-31 11:43:26
【问题描述】:
我有一个SqlDataReader 正在读取一个大型记录集(大约 1M 记录),我正在尝试使用 iTextSharp 将其导出到 PDF 文档。
这是我的代码:
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);
}
当我运行它时,它会导致严重的内存泄漏。 我可以采取哪些不同的措施来改善这一点?
【问题讨论】:
-
您为条件中的每个循环创建一个对象,例如
object o = reader[i];。这可能是问题 -
我不认为这是问题,因为如果我在做
datatable.AddCell(new Phrase(reader[i], fntList));它仍然会导致内存泄漏 -
在循环过程中,您将数据导出到数据表中,数据表是数据的内存表示。直到您的 mydocument.Add(datatable) 一切都累积在内存中。没有泄漏,只是设计不佳。
-
谢谢@mkl,你建议我应该做些什么来改进它?
-
@VahidN 同时提出了一种方法。更多详细信息可从 iText in Action 第 2 版以及在线提供的示例中获得。
标签: c# pdf-generation itextsharp