gpt4 book ai didi

c# - 如何减少具有许多单元格的 PdfPTable 的内存消耗

转载 作者:行者123 更新时间:2023-11-30 20:59:30 25 4
gpt4 key购买 nike

我正在使用由单个 PdfTable 组成的 ITextSharp 创建 PDF。不幸的是,对于特定数据集,由于创建了大量 PdfPCells,我遇到了内存不足异常(我已经分析了内存使用情况——我有将近 1/2 的百万个单元格!)

在这种情况下有什么办法可以减少内存使用量吗?我试过在不同点(每行之后)冲洗和完全压缩

PdfWriter 基于文件流

代码看起来很像这样:

Document document = Document();
FileStream stream = new FileStream(fileName,FileMode.Create);
pdfWriter = PdfWriter.GetInstance(document, stream);
document.Open();
PdfPTable table = new PdfPTable(nbColumnToDisplay);
foreach (GridViewRow row in gridView.Rows)
{
j = 0;
for (int i = 0; i < gridView.HeaderRow.Cells.Count; i++)
{
PdfPCell cell = new PdfPCell( new Phrase( text) );
table.AddCell(cell);
}
}
document.Add(table);
document.Close();

最佳答案

iTextSharp 有一个非常酷的界面,叫做 ILargeElement PdfPTable 实现。根据文档:

/**
* Interface implemented by Element objects that can potentially consume
* a lot of memory. Objects implementing the LargeElement interface can
* be added to a Document more than once. If you have invoked setCompleted(false),
* they will be added partially and the content that was added will be
* removed until you've invoked setCompleted(true);
* @since iText 2.0.8
*/

所以您需要做的就是在创建PdfPTable 之后,将Complete 属性设置为false。在你的内部循环中做某种形式的计数器,每隔一段时间添加表格并因此清除内存。然后在循环结束时将 Complete 设置为 true 并再次添加它。

下面是展示这一点的示例代码。在没有计数器检查的情况下,这段代码在我的机器上使用了大约 500MB 的 RAM。每 1,000 个项目进行一次计数器检查,它会下降到 16MB 的 RAM。您需要为计数器找到自己的最佳位置,这取决于您平均向每个单元格添加的文本量。

string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "table.pdf");
Document document = new Document();
FileStream stream = new FileStream(fileName, FileMode.Create);
var pdfWriter = PdfWriter.GetInstance(document, stream);
document.Open();

PdfPTable table = new PdfPTable(4);
table.Complete = false;
for (int i = 0; i < 1000000; i++) {
PdfPCell cell = new PdfPCell(new Phrase(i.ToString()));
table.AddCell(cell);
if (i > 0 && i % 1000 == 0) {
Console.WriteLine(i);
document.Add(table);
}
}
table.Complete = true;
document.Add(table);
document.Close();

关于c# - 如何减少具有许多单元格的 PdfPTable 的内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15482142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com