Hi Claudio, You have 12 total fields all of which you have indexed which is the default. You have 1 key field and 11 non-key fields. This will result in 23 index entries being written for each entity. You get 1 ascending index on the key field and by default you get both an ascending and descending index on the other 11 non-key fields. This will take A LOT of CPU for each entity. Do you need them all indexed? If not, I would set them to unindexed. That should help a lot. Stephen
2011/3/7 Cláudio Coelho <ereb...@gmail.com> > Since the bottleneck occurs when making objects of Location > persistent, I assume that is the only relevant class. If anything else > is relevant, tell me and I'll disclose. > > @PersistenceCapable(identityType = > IdentityType.APPLICATION,detachable="true") > public class Location{ > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > Long locationId; > @Persistent > long countryId; > @Persistent > String name; > @Persistent > String country=null; > @Persistent > double latitude,longitude; > @Persistent > int population; > @Persistent > long geoBoxL1,geoBoxL2,geoBoxL3,geoBoxL4,geoBoxL5; > public Location() > { > > } > public Location(String name, long countryId,String country, double > latitude, double longitude) > { > this.name=name; > this.countryId=countryId; > this.latitude=latitude; > this.longitude=longitude; > this.country=country; > } > public Location(LocationDTO dto) { > this(); > updateFromDTO(dto); > } > > public void updateFromDTO(LocationDTO dto) { > setLocationId(dto.getLocationId()); > setCountryId(dto.getCountryId()); > setCountry(dto.getCountry()); > setName(dto.getName()); > setPopulation(dto.getPopulation()); > setLatitude(dto.getLatitude()); > setLongitude(dto.getLongitude()); > setGeoBoxL1(dto.getGeoBoxL1()); > setGeoBoxL2(dto.getGeoBoxL2()); > setGeoBoxL3(dto.getGeoBoxL3()); > setGeoBoxL4(dto.getGeoBoxL4()); > setGeoBoxL5(dto.getGeoBoxL5()); > > > } > public LocationDTO getDTO() > { > LocationDTO dto = new LocationDTO(); > dto.setLocationId(getLocationId()); > dto.setCountryId(getCountryId()); > dto.setCountry(getCountry()); > dto.setName(getName()); > dto.setPopulation(getPopulation()); > dto.setLatitude(getLatitude()); > dto.setLongitude(getLongitude()); > dto.setGeoBoxL1(getGeoBoxL1()); > dto.setGeoBoxL2(getGeoBoxL2()); > dto.setGeoBoxL3(getGeoBoxL3()); > dto.setGeoBoxL4(getGeoBoxL4()); > dto.setGeoBoxL5(getGeoBoxL5()); > > return dto; > } > > public long getLocationId() { > return locationId; > } > public void setLocationId(long locationId) { > this.locationId = locationId; > } > public String getCountry() { > return country; > } > > public int getPopulation() { > return population; > } > public void setPopulation(int population) { > this.population = population; > } > public void setCountry(String country) { > this.country = country; > } > > public long getCountryId() { > return countryId; > } > public void setCountryId(long countryId) { > this.countryId = countryId; > } > public String getName() { > return name; > } > public void setName(String name) { > this.name = name; > } > public double getLatitude() { > return latitude; > } > public void setLatitude(double latitude) { > this.latitude = latitude; > } > public double getLongitude() { > return longitude; > } > public void setLongitude(double longitude) { > this.longitude = longitude; > } > > public long getGeoBoxL1() { > return geoBoxL1; > } > public void setGeoBoxL1(long geoBoxL1) { > this.geoBoxL1 = geoBoxL1; > } > public long getGeoBoxL2() { > return geoBoxL2; > } > public void setGeoBoxL2(long geoBoxL2) { > this.geoBoxL2 = geoBoxL2; > } > public long getGeoBoxL3() { > return geoBoxL3; > } > public void setGeoBoxL3(long geoBoxL3) { > this.geoBoxL3 = geoBoxL3; > } > public long getGeoBoxL4() { > return geoBoxL4; > } > public void setGeoBoxL4(long geoBoxL4) { > this.geoBoxL4 = geoBoxL4; > } > public long getGeoBoxL5() { > return geoBoxL5; > } > public void setGeoBoxL5(long geoBoxL5) { > this.geoBoxL5 = geoBoxL5; > } > } > > On Mar 7, 10:23 am, Didier Durand <durand.did...@gmail.com> wrote: > > Hi, > > > > Could you please disclose the source code of your objects stored in > > the ds ? > > > > You maybe right or wrong depending on how they were defined. > > > > regards > > > > didier > > > > On Mar 7, 9:41 am, Cláudio Coelho <ereb...@gmail.com> wrote: > > > > > > > > > > > > > > > > > Hi > > > I'm quite new at GAE, so I'm probably saying something silly, but for > what I > > > read on GAE Java and GWT Application Development, I was under the > impression > > > that GAE would generate indexes automatically except for some variable > types > > > (blobs, text, etc) and for when we explicitly asked it not to. > > > However, when I look at the datastore-indexes-auto.xml file, it is > indeed > > > empty. Through debugging I have been able to isolate that it's the > > > bottleneck is pm.makeConsistent of each entity to insert. Wouldn't > having > > > indexes make the inserting even slower (since these indexes have to be > > > updated/rebuilt)? > > > > > thanks > > > > > C. > > > > > On Mon, Mar 7, 2011 at 5:44 AM, Didier Durand <durand.did...@gmail.com > >wrote: > > > > > > Hi, > > > > > > The first issue that comes to mind in missing indexes: so huge scans > > > > of all existing data when you upload an additional line. > > > > > > What are your indexes ? > > > > > > regards > > > > > > didier > > > > > > On Mar 6, 12:43 pm, Cláudio Coelho <ereb...@gmail.com> wrote: > > > > > Hi, > > > > > My application needs a db of the world cities. I have a file that > has > > > > about > > > > > 100k lines and I want to use it to populate the datastore. > > > > > My first attempt failed because I didn't use tasks, so I was only > able to > > > > > upload a limited set of cities. It spent 2% of CPU total time on > the app > > > > > engine. > > > > > I then changed the approach to use tasks. > > > > > I basically read the file once to determine how many lines does it > have > > > > and > > > > > then invoke tasks to read batches of 15k lines (supplying a start > and end > > > > > indexes). > > > > > These invoked tasks (createCities(int start, int end)) read the > file > > > > again, > > > > > get a list of 15k lines and then process it. > > > > > The whole process takes about 15 seconds on my machine, however, > when I > > > > do > > > > > this in the app engine, it takes 15 minutes (or more) and maxes out > the > > > > 6.5 > > > > > hours of CPU time! I know there are plenty of optimizations I > should do > > > > to > > > > > this process, but that doesn't seem to justify the 6.5 hours, so I > must > > > > be > > > > > doing something seriously wrong. > > > > > > > Does anybody have any clue of what I'm doing wrong? (Code attached) > > > > > > > Thanks! > > > > > > > private void createCities() { > > > > > try > > > > > { > > > > > int count = countCitiesToLoad(); > > > > > final int batchSize = 15000; > > > > > for(int start=0;start<count;start+=batchSize) > > > > > { > > > > > int end=start+batchSize; > > > > > Queue queue = QueueFactory.getQueue("dbQueue"); > > > > > TaskOptions topt = TaskOptions.Builder.withUrl("/dbservlet"); > > > > > topt.param("command", "createCities"); > > > > > topt.param("start", ""+start); > > > > > topt.param("end", ""+end); > > > > > queue.add(topt); > > > > > logInfo("Dispatched order to create cities "+start+" to "+end); > > > > > Thread.sleep(500);} > > > > > }catch(Exception e) > > > > > > > { > > > > > e.printStackTrace(); > > > > > logError(e.getLocalizedMessage()); > > > > > > > } > > > > > } > > > > > > > private void createCities(int start, int end) > > > > > { > > > > > try > > > > > { > > > > > logInfo("Reading cities "+start+" to "+end); > > > > > BufferedReader br= new BufferedReader(new > FileReader("data/cities.csv")); > > > > > String line=br.readLine(); > > > > > int counter=0; > > > > > PersistenceManager pm = PMF.get().getPersistenceManager(); > > > > > ArrayList<String> lines = new ArrayList<String>(); > > > > > while(line!=null || counter<end) > > > > > { > > > > > if(counter>=start && counter <end) > > > > > lines.add(line); > > > > > counter++; > > > > > line=br.readLine();} > > > > > > > br.close(); > > > > > logInfo("Adding cities "+start+" to "+end); > > > > > createCities(lines); > > > > > logInfo("Done cities "+start+" to "+end);} > > > > > > > catch(Exception e) > > > > > { > > > > > e.printStackTrace(); > > > > > logError(e.getLocalizedMessage()); > > > > > > > } > > > > > } > > > > > > > private void createCities(ArrayList<String> lines) > > > > > { > > > > > if(lines==null) > > > > > return; > > > > > PersistenceManager pm = PMF.get().getPersistenceManager(); > > > > > HashMap<String, Country> countryMap = loadCountryMap(); > > > > > try{ > > > > > for(String line : lines) > > > > > if(line!=null) > > > > > { > > > > > String fields[]=line.split(","); > > > > > if(fields.length<7) > > > > > logError("length error in line:"+line); > > > > > else > > > > > { > > > > > Location loc = new Location(); > > > > > loc.setName(fields[2]); > > > > > loc.setLatitude(Double.parseDouble(fields[3])); > > > > > loc.setLongitude(Double.parseDouble(fields[4])); > > > > > loc.setPopulation(Integer.parseInt(fields[6])); > > > > > { > > > > > Country c = countryMap.get(fields[5]); > > > > > if(c==null) > > > > > logError("Failed to get country for:"+line); > > > > > else > > > > > { > > > > > loc.setCountryId(c.getCountryId()); > > > > > loc.setCountry(c.getName()); > > > > > pm.makePersistent(loc);} > > > > > } > > > > > } > > > > > } > > > > > } catch (Exception e) { > > > > > > > e.printStackTrace(); > > > > > > > } finally { > > > > > pm.close(); > > > > > } > > > > > } > > > > > > -- > > > > You received this message because you are subscribed to the Google > Groups > > > > "Google App Engine for Java" group. > > > > To post to this group, send email to > > > > google-appengine-java@googlegroups.com. > > > > To unsubscribe from this group, send email to > > > > google-appengine-java+unsubscr...@googlegroups.com. > > > > For more options, visit this group at > > > >http://groups.google.com/group/google-appengine-java?hl=en. > > > > > -- > > > Cláudio Coelho > > > > > "Great spirits have often encountered violent opposition from weak > minds." > > > A. Einstein > > -- > You received this message because you are subscribed to the Google Groups > "Google App Engine for Java" group. > To post to this group, send email to > google-appengine-java@googlegroups.com. > To unsubscribe from this group, send email to > google-appengine-java+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/google-appengine-java?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to google-appengine-java@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.