Google appengine: Desempenho da fila de tarefas

Atualmente, tenho um aplicativo em execução no appengine e estou executando alguns trabalhos usando a biblioteca adiada, algumas dessas tarefas são executadas diariamente, enquanto outras são executadas uma vez por mês. A maioria dessas tarefas consulta o armazenamento de dados para recuperar documentos e, em seguida, armazena as entidades em um índice (API de pesquisa). Algumas dessas tabelas são substituídas mensalmente e eu tenho que executar essas tarefas em todas as entidades (4 ~ 5M).

Um exemplo dessa tarefa é:

def addCompaniesToIndex(cursor=None, n_entities=0, mindate=None):
    #get index
    BATCH_SIZE = 200
    cps, next_cursor, more = Company.query().\
                                     fetch_page(BATCH_SIZE,
                                                start_cursor=cursor)

    doc_list = []

    for i in range(0, len(cps)):
        cp = cps[i]
        #create a Index Document using the Datastore entity
        #this document has only about 5 text fields and one date field
        cp_doc = getCompanyDocument(cp)
        doc_list.append(cp_doc)

    index = search.Index(name='Company')
    index.put(doc_list)

    n_entities += len(doc_list)

    if more:
        logging.debug('Company: %d added to index', n_entities)
        #to_put[:] = []
    ,    doc_list[:] = []
        deferred.defer(addCompaniesToIndex,
                       cursor=next_cursor,
                       n_entities=n_entities,
                       mindate=mindate)
    else:
        logging.debug('Finished Company index creation (%d processed)', n_entities)

Quando executo apenas uma tarefa, a execução leva cerca de 4-5s por tarefa adiada, portanto, a indexação das minhas entidades de 5 milhões de pessoas leva cerca de 35 horas.

Outra coisa é que, quando executo uma atualização em outro índice (por exemplo, uma das atualizações diárias) usando uma tarefa adiada diferente na mesma fila, ambas são executadas muito mais lentamente. E comece a demorar cerca de 10 a 15 segundos por chamada adiada, o que é insuportável.

Minha pergunta é: existe uma maneira de fazer isso mais rapidamente e escalar a fila de envio para mais de um trabalho em execução a cada vez? Ou devo usar uma abordagem diferente para esse problema?

Desde já, obrigado,

questionAnswers(2)

yourAnswerToTheQuestion