我正在编写一份包含大量内容的报告,并且pdf的大小越来越大,以便在服务器内存上写入。
现在我正在运行一项超过500万条记录的测试(实际生产案例),数据本身需要近4.5GB,pdf现在正在编写350万条注册表,而应用程序的内存使用情况则是在35GB。
现在运行速度非常慢,因为服务器的内存占用了95%。
我的代码看起来像这样:
Console.WriteLine("Gathering Data");
DataTable dt = functionthatgathersdata();
Document document = new Document(PageSize.A4.Rotate(), 0f, 0f, 140f, 70f);
using (FileStream ms = new FileStream(@"E:\rel.pdf", FileMode.Create))
{
PdfWriter writer = PdfWriter.GetInstance(document, ms);
writer.PageEvent = new PageTemplateReport()
{
attr = "report header"
};
document.Open();
iTextSharp.text.Font font5 = iTextSharp.text.FontFactory.GetFont(FontFactory.HELVETICA, 8);
PdfPTable table = new PdfPTable(dt.Columns.Count - 1);
float[] widths = new float[] { 50f, 100f, 40f, 50f, 50f, 50f, 130f, 50f, 50f, 28f, 35f };
table.SetWidths(widths);
table.WidthPercentage = 95f;
table.HeaderRows = 1;
PdfPCell cell = new PdfPCell(new Phrase("Report"));
cell.Colspan = dt.Columns.Count - 1;
table.AddCell(new Phrase("col1", font5));
table.AddCell(new Phrase("col2", font5));
table.AddCell(new Phrase("col3", font5));
table.AddCell(new Phrase("col4", font5));
table.AddCell(new Phrase("col5", font5));
table.AddCell(new Phrase("col6", font5));
table.AddCell(new Phrase("col7", font5));
table.AddCell(new Phrase("col8", font5));
table.AddCell(new Phrase("col9", font5));
table.AddCell(new Phrase("col10", font5));
table.AddCell(new Phrase("col11", font5));
var i = 0;
foreach (DataRow r in dt.Rows)
{
i++;
Console.WriteLine(i.ToString() + " of " + dt.Rows.Count + " " + "size: " + ms.Length / 1024 + "KB");
if (dt.Rows.Count > 0)
{
table.AddCell(new Phrase(r[0].ToString(), font5));
table.AddCell(new Phrase(r[1].ToString(), font5));
table.AddCell(new Phrase(r[2].ToString(), font5));
table.AddCell(new Phrase(r[3].ToString(), font5));
table.AddCell(new Phrase(r[4].ToString(), font5));
table.AddCell(new Phrase(r[5].ToString(), font5));
table.AddCell(new Phrase(r[7].ToString(), font5));
table.AddCell(new Phrase(r[8].ToString(), font5));
table.AddCell(new Phrase("", font5));
table.AddCell(new Phrase(r[10].ToString(), font5));
table.AddCell(new Phrase((r[11].ToString() == string.Empty) ? "" : Convert.ToDecimal(r[11].ToString()).ToString("N2") + " KB", font5));
}
}
document.Add(table);
ms.Close();
}
对于数据部分,我可以解决收集数据块的问题,编写它们并将它们处理以获得另一个数据块。
对于pdf部分,我想知道是否有办法直接在磁盘上写入数据,而不是从内存中操作它。