Ошибка превышения срока действия

#google-app-engine #gqlquery

#google-app-engine #gqlquery

Вопрос:

Когда я пытаюсь использовать запрос в хранилище данных Google App Engine, подобный этому:

 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() для индексированного вида. Покажите нам свой код!

Ответ №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)
  

Вы извлекаете каждый отдельный объект Feed обратно из хранилища данных, а затем локально фильтруете список на основе поискового запроса. Если вы хотите отображать только 10 записей на странице, выполните fetch(10) для вашего объекта запроса, чтобы не пытаться удалить все объекты на одной странице. Используйте курсоры запросов для разбивки на страницы. Если вы хотите отфильтровать большой набор объектов, вам необходимо предварительно определить индекс хранилища данных, который будет удовлетворять запросу; выборка всего и локальная фильтрация недопустимо неэффективны.

Комментарии:

1. По сути, он выполняет ужасное «сканирование таблицы». Я не думаю, что fetch(10) смог бы решить проблему, поскольку он должен прочитать все объекты, чтобы найти правильное соответствие. Я бы выбрал что-то вроде этого code.google.com/p/gae-text-search избавляемся от функции разбивки на страницы.