Re: Large Data Set problems
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
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
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) {