I'm having an issue with the performance of getPrintHTML() and exportClientData() on some of my grids with larger datasets ( ~4000-5000 rows). It takes a long time and a lot of memory to execute either command. I've put together a test case derived from the builtinds sample that uses the supplyItem DS to create a tree of similar size to my application. I'm using the 10/26 nightly build but had the same issue with the 10/16 build.
In my setup (FF 24, Chrome), it takes approximately:
• 20 – 90 seconds to export the CSV
• 12-24 seconds to get the print HTML and the memory usage grows by about 150MB! In chrome, the tab seems to hang for a while after generating.
In order to successfully export - I did need to increase the maxFormContentSize in jetty, as the uploaded form is larger than the default 400KB - though almost all of the time is spent on the client before the upload...
In my setup (FF 24, Chrome), it takes approximately:
• 20 – 90 seconds to export the CSV
• 12-24 seconds to get the print HTML and the memory usage grows by about 150MB! In chrome, the tab seems to hang for a while after generating.
Code:
VLayout layout = new VLayout();
layout.setHeight(300);
layout.setWidth(600);
final TreeGrid grid = new TreeGrid();
DataSource ds = DataSource.get("supplyItem");
grid.setTreeRootValue("NULL");
grid.setTreeFieldTitle("itemName");
grid.setDataSource(ds);
IButton button = new IButton("export");
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
DSRequest req = new DSRequest();
req.setExportAs(ExportFormat.CSV);
req.setExportToClient(true);
req.setExportDisplay(ExportDisplay.WINDOW);
grid.exportClientData();
}} );
IButton printHTML= new IButton("GetPrintHTML");
printHTML.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
PrintProperties pp = new PrintProperties();
grid.getPrintHTML( pp, new PrintHTMLCallback() {
@Override
public void setHTML(String html) {
Window win = new Window();
HTMLPane pane = new HTMLPane();
pane.setWidth(1000);
pane.setHeight(600);
pane.setContents(html);
win.addItem(pane);
win.setAutoSize(true);
win.setAutoCenter(true);
win.draw();
}} );
}} );
grid.setUseAllDataSourceFields(true);
grid.setAutoFetchData(false);
ds.fetchData(null,new DSCallback() {
@Override
public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest) {
Tree tree = new Tree();
tree.setParentIdField("category");
tree.setIdField("itemName");
tree.setRootValue("NULL");
for ( Record r : dsResponse.getData() ) {
if ( tree.find("itemName",r.getAttribute("category")) == null) {
TreeNode newR = new TreeNode();
newR.setAttribute("itemName", r.getAttribute("category"));
newR.setAttribute("category", "NULL");
newR.setAttribute("isFolder", true);
tree.linkNodes(new TreeNode[] { newR } );
}
r.setAttribute("isFolder", false);
TreeNode t = new TreeNode();
Record.copyAttributesInto(t,r,r.getAttributes());
tree.linkNodes(new TreeNode[] { t });
}
tree.openAll();
grid.setData(tree);
}} );
layout.setMembers(grid,button,printHTML);
layout.draw();
Comment