2011-04-26 2 views
2

이 같은 구글 앱 엔진의 데이터 저장소에서 쿼리 사용하려고하면 :이 오류가DeadlineExceededError

user = User.all().filter('name =',userName).get() 

을 : DeadlineExceededError합니다.

편집 : 이 제 기능입니다 :

def feeds(request): 
    dict = get_user_details() 
    search_key = None 
    if request.GET.has_key('search_key'): 
     search_key = request.GET['search_key'] 
     dict['search_key']=search_key 
    feeds = list() 
    if search_key is not None and search_key!="": 
     feeds_list = Feed.all().order('-CreatedDate') 
     search_string=string.upper(search_key) 
     for feed in feeds_list: 
      feed_name=string.upper(feed.FeedUrl) 
      if search_string in feed_name: 
       feeds.append(feed) 
      dict['search_key']=search_key 
    else: 
     feeds = Feed.all().order('-CreatedDate') 
    if request.GET.has_key('page'): 
     page = request.GET['page'] 
    try: 
     page = int(page) - 1 
    except: 
     page = 0 

    paginator = Paginator(feeds,10) 
    if page>=paginator._get_num_pages(): 
     page = paginator._get_num_pages() - 1 

    dict["page_obj"]  = paginator.page(page+1) 
    return render_to_response('feed_list.html', dict, context_instance=RequestContext(request)) 

이 피드에 검색, 그것은 DeadlineExceededError을 제기, 너무 많은 시간이 걸립니다.

+1

인덱싱 된 종류의 get()보다 처리기에서 뭔가 더 많은 시간이 걸릴 것이라고 생각합니다. 코드를 보여주세요! – systempuntoout

답변

1

이 확장되지 않습니다

feeds_list = Feed.all().order('-CreatedDate') 
    search_string=string.upper(search_key) 
    for feed in feeds_list: 
     feed_name=string.upper(feed.FeedUrl) 
     if search_string in feed_name: 
      feeds.append(feed) 

을 당신은 데이터 저장소에서 다시 모든 단일 피드 객체를 당겨 다음 로컬 검색어에 따라 목록을 필터링하고 있습니다. 페이지 당 10 개의 레코드 만 표시하려면 쿼리 개체에 fetch(10)을 입력하여 한 페이지에서 모든 엔터티를 취소하려고하지 마십시오. 페이지 매기기에는 query cursors을 사용하십시오. 대규모 엔터티 집합을 필터링하려면 쿼리를 만족시킬 데이터 저장소 인덱스를 미리 정의해야합니다. 모든 것을 가져오고 국지적으로 필터링하는 것은 엄청나게 비효율적입니다.

+0

그는 기본적으로 두려운 "테이블 스캔"을 수행하고 있습니다. 나는 올바른 일치를 찾기 위해 모든 엔티티를 읽어야하기 때문에'fetch (10)'이 문제를 해결할 수 있다고 생각하지 않는다. http://code.google.com/p/gae-text-search/ 페이지 매기기 기능을 제거하는 것과 같은 방법을 사용합니다. – systempuntoout