Re: Large Data Set problems

2009-06-16 Thread Joe Larson

Well, looks like paging it is.  Thanks everyone.

Oh, and Hi Tom!

-Joe

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Google Web Toolkit group.
To post to this group, send email to Google-Web-Toolkit@googlegroups.com
To unsubscribe from this group, send email to 
google-web-toolkit+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~--~~~~--~~--~--~---



Re: Large Data Set problems

2009-06-12 Thread Tercio

Hi!

The problem is that in your function public void showUsers() { you
create a entry into FlexTable for each user, including the non-visible
ones.

Some browsers have problems displaying a huge data.

To solve this you have 2 options:

Create some kind of pagination into your flextable, creating a set of
your users and display only the possible visible ones(Something like
50), and remove/add the users as the user navigate through it.

Other option as Tom Hjeliming said, is to use some framework like
SmartGWT(http://code.google.com/p/smartgwt/). SmartGWT have a lot of
features and Widgets that makes life easier.
One of them is the Live Grid(http://www.smartclient.com/smartgwt/
showcase/#featured_grid_live), in the example it have around 700
records, but only render the visible ones, so it runs smooth on IE and
Firefox.

SmartGWT can load only a partial set of the data and ask server for
more when needed or load everything, depends on your requirement.

Regards

On Jun 11, 2:13 pm, Tom Hjellming thjellm...@riverglassinc.com
wrote:
 Hi Joe,

 The trick is to not even try to load that much data into the browser.  
 We use the SmartGWT widget library which has very good support for
 virtual pagination of lists and comboboxes.  By default, it only loads
 the first 75 rows and then as the user scrolls down, calls are made back
 to the server to retrieve the desired data - which is then shown to the
 user.  There is an occasional delay when the user sees blank space which
 is then filled in when the data comes in.  But overall, it is a great
 solution -we're viewing tables with thousands of rows and seeing better
 performance than our old Swing-based application.

 Tom



 Joe Larson wrote:
  I am having a performance problem.  I am trying to build a page that
  allows the user to select from a fairly large list of objects (up to
  20,000).  We have filtering capabilities to trim the list so the user
  doesn't have to scroll through all of them.  It's a reasonable UI.

  Unfortunately, I only get decent performance on Safari.  IE6 is
  exceptionally miserable.  It's okay when the list has 100 items, but
  it crashes as we exceed 300.  So I've been experimenting, and I
  haven't found a way around it.

  So I created a sample app.  All I did was populate an
  ArrayListString with 20,000 fairly short strings that I read out of
  the HTML file.  Under Safari 4 on a G5 Mac Pro, this is almost
  instant.  Under IE6 on a similar age Windows box, it's taking 4
  minutes.  Firefox on the G5 runs out of memory.

  Is it possible to store large amounts of data in my GWT applications?
  Or do I have to store fairly small amounts of data and go back and
  forth to the server a lot?  If it's the latter, I may as well just go
  back to what we used to do (WebObjects).

  I'm including my little sample program.  Maybe there's something
  obvious that I can do?

  -Joe

  --- GWTMinimum.java ---
  package com.missionmode.gwtminimum.client;

  import java.util.*;

  import com.google.gwt.core.client.*;
  import com.google.gwt.user.client.*;
  import com.google.gwt.user.client.ui.*;

  /**
   * Entry point classes define codeonModuleLoad()/code.
   */
  public class GWTMinimum implements EntryPoint {
     public FlexTable                        panel;
     public Button                           loadBtn;
     public Button                           displayBtn;
     public ListBox                          listBox;
     public Label                            label;
     public ArrayListString  usernames = new ArrayListString();
     public String[] parts;

     /**
      * This is the entry point method.
      */
     public void onModuleLoad() {
             panel = new FlexTable();
             RootPanel.get(web2).add(panel);

             loadBtn = new Button(Click to start load);
             panel.setWidget(0, 0, loadBtn);

             loadBtn.addClickListener(new ClickListener() {
                     public void onClick(Widget sender) {
                             loadUsers();
                     }
             });
     }

     /**
      * We've loaded the user table.  Set up so they
      * can press another button to display the data.
      */
     public void setupForDisplay() {
             displayBtn = new Button(Click to Display);
             panel.setWidget(0, 1, displayBtn);
             displayBtn.addClickListener(new ClickListener() {
                     public void onClick(Widget sender) {
                             showUsers();
                     }
             });
     }

     /**
      * Load the users from the HTML page.
      */
     public void loadUsers() {
             if (parts == null) {
                     String str = stringFromDocument(users);
                     parts = str.split(===);
                     loadBtn.setText(Click me again);
             }
             else {
                     for (String name : parts) {
                             name = name.trim();
                  

Re: Large Data Set problems

2009-06-11 Thread Tom Hjellming

Hi Joe,

The trick is to not even try to load that much data into the browser.  
We use the SmartGWT widget library which has very good support for 
virtual pagination of lists and comboboxes.  By default, it only loads 
the first 75 rows and then as the user scrolls down, calls are made back 
to the server to retrieve the desired data - which is then shown to the 
user.  There is an occasional delay when the user sees blank space which 
is then filled in when the data comes in.  But overall, it is a great 
solution -we're viewing tables with thousands of rows and seeing better 
performance than our old Swing-based application.

Tom


Joe Larson wrote:
 I am having a performance problem.  I am trying to build a page that
 allows the user to select from a fairly large list of objects (up to
 20,000).  We have filtering capabilities to trim the list so the user
 doesn't have to scroll through all of them.  It's a reasonable UI.

 Unfortunately, I only get decent performance on Safari.  IE6 is
 exceptionally miserable.  It's okay when the list has 100 items, but
 it crashes as we exceed 300.  So I've been experimenting, and I
 haven't found a way around it.

 So I created a sample app.  All I did was populate an
 ArrayListString with 20,000 fairly short strings that I read out of
 the HTML file.  Under Safari 4 on a G5 Mac Pro, this is almost
 instant.  Under IE6 on a similar age Windows box, it's taking 4
 minutes.  Firefox on the G5 runs out of memory.

 Is it possible to store large amounts of data in my GWT applications?
 Or do I have to store fairly small amounts of data and go back and
 forth to the server a lot?  If it's the latter, I may as well just go
 back to what we used to do (WebObjects).

 I'm including my little sample program.  Maybe there's something
 obvious that I can do?

 -Joe

 --- GWTMinimum.java ---
 package com.missionmode.gwtminimum.client;

 import java.util.*;

 import com.google.gwt.core.client.*;
 import com.google.gwt.user.client.*;
 import com.google.gwt.user.client.ui.*;

 /**
  * Entry point classes define codeonModuleLoad()/code.
  */
 public class GWTMinimum implements EntryPoint {
   public FlexTablepanel;
   public Button   loadBtn;
   public Button   displayBtn;
   public ListBox  listBox;
   public Labellabel;
   public ArrayListStringusernames = new ArrayListString();
   public String[] parts;

   /**
* This is the entry point method.
*/
   public void onModuleLoad() {
   panel = new FlexTable();
   RootPanel.get(web2).add(panel);

   loadBtn = new Button(Click to start load);
   panel.setWidget(0, 0, loadBtn);

   loadBtn.addClickListener(new ClickListener() {
   public void onClick(Widget sender) {
   loadUsers();
   }
   });
   }

   /**
* We've loaded the user table.  Set up so they
* can press another button to display the data.
*/
   public void setupForDisplay() {
   displayBtn = new Button(Click to Display);
   panel.setWidget(0, 1, displayBtn);
   displayBtn.addClickListener(new ClickListener() {
   public void onClick(Widget sender) {
   showUsers();
   }
   });
   }

   /**
* Load the users from the HTML page.
*/
   public void loadUsers() {
   if (parts == null) {
   String str = stringFromDocument(users);
   parts = str.split(===);
   loadBtn.setText(Click me again);
   }
   else {
   for (String name : parts) {
   name = name.trim();
   if (name.length()  0) {
   usernames.add(name);
   }
   }
   showCount();
   setupForDisplay();
   }
   }

   /**
* Just show how many users were actually loaded.
*/
   public void showCount() {
   label = new Label(Total user count:  + usernames.size());
   panel.setWidget(1, 0, label);
   }

   /**
* Show the loaded users.
*/
   public void showUsers() {
   try {
   listBox = new ListBox();
   listBox.setVisibleItemCount(20);
   panel.setWidget(2, 0, listBox);
   for (String str : usernames) {
   listBox.addItem(str);
   }
   }
   catch (Exception e) {