Memory Optimization

If a document deals with a lot of data or large elements, such as images, it is not wise to build the sections entirely in memory and then add them to the document. If you take a look at the code above and run it with 1,000,000 rows, you will run into an OutOfMemoryError!  You can try this for yourself by downloading the source code linked above. This is where the LargeElement interface that the PdfPTableChapter, and Sectionclasses implement, comes into play. Classes implementing the LargeElement interface can be added to the document before they are complete.This is achieved by setting the complete property to false.

void setComplete(boolean complete)

If you invoke setComplete(false), you indicate that the content of the object isn’t complete yet; it can be added to the document partially, but more will follow. If you invoke setComplete(true), you indicate that you won’t add any more data to the object.Once this is done, the element can be repeatedly added to the document, releasing memory that the added portion used. More information about the LargeElement interface can be found in the API Docs and this article with examples.Combining The TechniquesIt gets complex when you want to combine memory optimization and element grouping in scenarios that are not trivial.  The following code snippet modifies the previous example to show how to combine techniques.

public static void memoryOptimizedElementGrouping(String filename, int rows)
throws DocumentException, IOException {
Document document = new Document(); // Create a document.
PdfWriter.getInstance(document, new FileOutputStream(filename)); //Setup the writer
document.open(); // Open the document PdfPTable mainTable = new PdfPTable(columns); // Main table of data
mainTable.setComplete(false);
PdfPTable alias = mainTable; //Alias to use for adding content.
for (int i = 0; i < rows; ++i) {
if (i == rows/2) { // Group at halfway point
alias = new PdfPTable(columns); // Re-alias to new group table
alias.setKeepTogether(true);
}
if (i == rows/2 + 5) { // Add group 5 rows later.
PdfPCell groupCell = new PdfPCell(alias); // Create the cell for group table
groupCell.setColspan(columns); //Set it to span the entire mainTable
mainTable.addCell(groupCell); //Add the group table to the main table
alias = mainTable;
}
if (alias == mainTable && i % 10 == 0) { // If no longer grouping
document.add(mainTable); // and i divisible by 10,
} // Add to the document
alias.addCell(new Phrase("Left Cell "+i));
alias.addCell(new Phrase("Right Cell "+i));
} mainTable.setComplete(true); //Set the table as complete
document.add(mainTable); //Add the mainTable to the document for last time.
document.close(); //Close the document.
}

First notice that the mainTable has its complete property set to false.  The main difference in the loop from the the last example is that the grouping happens in the middle of the table for five rows.  The memory optimization occurs in the third if block. The key point is to first check that alias is pointing to the mainTable. If you have not added your group to the mainTable and try adding the mainTable to the document, you will not get any new data from the group with subsequent additions of the mainTable. After the loop, the mainTable has its complete property to true, marking it as finished.  It can then be added to the document for a final time. If you run the source code, you can see that this second example can be run with 1,000,000 rows without causing an OutOfMemoryError.

转自:http://jandyco.com/advanced-itext/

另自己也有解决方案:

//for循环中添加如下代码
int _MAX_ROWS = 1000;//最大行数,之后清理
int row_count = 0;//初始值
if (++row_count % _MAX_ROWS == 0) {
//datatable是我的一个PdfPTable的new出来的一个实例
// add table to Document
document.add(datatable);
// delete _MAX_ROWS from table to free memory
datatable.deleteBodyRows();
// let iText manage when table header written
datatable.setSkipFirstHeader(true);//防止释放后一页出现两次表头。
}

详细参阅:

http://blog.csdn.net/ae6623/article/details/11590611

itext 落雨 out of membery Memory Optimization的更多相关文章

  1. <Redis Advance><Pipelining><Memory Optimization><Expire><Transactions>

    Overview About Redis pipelining About Redis memory optimization About Redis expire About Redis trans ...

  2. maven nexus memory optimization

    #链接地址:https://help.sonatype.com/repomanager3/system-requirements#filehandles While starting Nexus I ...

  3. config large memory

    C Configuring Large Memory Optimization This appendix provides information for configuring memory op ...

  4. Everything You Always Wanted to Know About SDRAM (Memory): But Were Afraid to Ask

    It’s coming up on a year since we published our last memory review; possibly the longest hiatus this ...

  5. Redis: Reducing Memory Usage

    High Level Tips for Redis Most of Stream-Framework's users start out with Redis and eventually move ...

  6. In-Memory:在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  7. C++ 应用程序性能优化

    C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...

  8. Oracle启动报错ORA-27102解决

    环境:RHEL5.5 + Oracle 10.2.0.4 此错误一般是因为数据库的初始化参数文件的内存设置不当导致.本例是因为操作系统参数设置问题导致. 当前现象:Oracle启动报错ORA-2710 ...

  9. Which is the best opencv or matlab for image processing?

    http://www.researchgate.net/post/Which_is_the_best_opencv_or_matlab_for_image_processing Annette Mor ...

随机推荐

  1. .NET委托与事件文章收集

    学习这方面的知识,先将文章收集着,以待以后查看. 张子阳 C# 中的委托和事件

  2. Android 侧滑菜单的简单实现(SlidingMenu)二

    在上一篇博文中已经简单的实现了侧滑菜单,代码也很简单,就几行代码. 这篇文章依然讲侧滑菜单,与前一篇文章不同的是,这篇文章用不同的代码方式来实现侧滑菜单. 在前面的文章中已经用了在Activity中通 ...

  3. 第四十二篇、自定义Log打印

    1.在Xcode 8出来之后,需要我们去关闭多余的日志信息打印 2.在开发的过程中,打印调试日志是一项比不可少的工程,但是在iOS 10中NSLog打印日志被屏蔽了,就不得不使用自定义Log 3.去掉 ...

  4. 手机看youtube的方法|一个好用的VPN

    俗话说:网络无国界.但是由于天朝的限制,我们无法访问YouTube .谷歌.twitter等一些国外网站. 这个时候我们就需要FQ.最直接有效的方法就是:VPN(虚拟专用网络). 虚拟专用网络的功能是 ...

  5. 学习之spring自带缓存

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://w ...

  6. .htaccess文件 使用

    .htaccess文件 用法1:自错误页面 ErrorDocument 404 /error/404.html ErrorDocument 403/error/403.html 用法2:重定向 Red ...

  7. Android 布局 中实现适应屏幕大小及组件滚动

    要实现如图的布局: 这是在eclipse可视化窗口中的截图,但实际运行在Android设备上可能出现的问题有: (1):当编辑图1中的最后一个EditText时,输入法的编辑界面会把底部的Button ...

  8. sql2005下载和安装

    下载地址:个人百度网盘 http://pan.baidu.com/s/1kTvKIZd sql05安装包.rar 1.54G这个 安装方法: 先安装Tool 在安装Server http://bbs. ...

  9. 【转】oracle中触发器中:new和:old 的使用方法

    create or replace trigger TRI_PrintTest before delete or insert or update on TEST_EXAM --触发事件 for ea ...

  10. mysql之多表查询

    今天在项目中遇到一个数据库查询的问题:三张表分别放置不同的东西:分享的音频相关数据.分享的文字图片说说.分享的主题相关数据.所有分享的东西都可看做新鲜事,现在要求从这三张表将相同的几个字段的数据全部查 ...