当前位置:首页 > 服务端 > itext 落雨 out of membery Memory Optimization

itext 落雨 out of membery Memory Optimization

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

 

作者:_落雨
来源链接:https://www.cnblogs.com/ae6623/p/4416301.html

版权声明:
1、Java侠(https://www.javaxia.com)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaxia.com/server/125512.html

标签: out of memory
分享给朋友: