*In my store,have more than 100,000 entities here,but i find delete(limit
400) it's cost > 26s*
my datas is wrong so i must delete all entities of the kind(no index in the
kind)!

*1. first i use:*
Query q = pm.newQuery(query);
                       q.setRange(0, 400);
int count = 0;
                       try {
                               resultList = (List<T>) q.execute();
                               for (T t : resultList) {
                                       pm.deletePersistent(t);
                                       count++;
                               }
                               return count;
                       } finally {
                               q.closeAll();
                       }
I found that:every time it's delete only few entity(<100)!(I watch 200
entities of the kind with GAE Datastore Viewer)

*2 second i use:*

UtilGAE.howTimer(true),return how time cost with a threadlocal var store a
start millionseconds,arg is a flag(true if cost time>26second throw a
IllegalStateException("it's cost more than limit 26s");

DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
        Query query = new
Query(Section.class.getSimpleName()).setKeysOnly();
        int count = 0;
        try {
            Iterable<Entity> iter =
ds.prepare(query).asIterable(FetchOptions.Builder.withLimit(400));
            logger.info("query cost time:{}s",
UtilGAE.howTimer(true)/1000d);
            for (Entity entity : iter) {
                Key key = entity.getKey();
                ds.delete(entity.getKey());
                count++;
                UtilGAE.howTimer(true);
            }
            if (count != 0) throw new IllegalStateException("next continue
to delete...");
        } finally {
            logger.info("delete:{},cost time:{}s", count,
UtilGAE.howTimer()/1000d);
        }
so it's work fine(it's real delete entity from my store) and a most of cost
time in the 26s!

I say there have most of limited in the GAE Stored!you must to be carefull
when you have a larger datastore!

2010/3/12 Toby <[email protected]>

> Hello,
>
> deleting 500 should not take a lot of time. Did you try the
> deletePersistentAll method?
>                        Query q = pm.newQuery(persistentClass);
>                        q.deletePersistentAll();
>
> otherwise what I do is using the task queue. I delete 1000 entities
> and then put a task in the queue to delete another 1000. In that case
> you can not use the deletePersistentAll. You need to query by object
> type and limit:
>
>                        Query q = pm.newQuery(query);
>                        q.setRange(0, size);
>
>                        try {
>                                resultList = (List<T>) q.execute();
>                                resultSize = resultList.size();
>                                for (T t : resultList) {
>                                        pm.deletePersistent(t);
>                                }
>                                return resultSize;
>                        } finally {
>                                q.closeAll();
>                        }
>
> since I return the size I see how much records where affected. If it
> is less than 1000 I know that I can stop doing the queuing.
> This is a bit difficult to set up but works fine. I believe there is
> not better way to do that but I am happy about any other suggestions.
>
> Cheers,
> Toby
>

-- 
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 [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to