10

nella mia app ho alcune operazioni batch che eseguo. sfortunatamente questo a volte richiede un tempo infinito per aggiornare 400-500 entità. quello che ho sono tutte le chiavi di entità, ho bisogno di ottenerle, aggiornare una proprietà e salvarle nell'archivio dati e il loro salvataggio può richiedere fino a 40-50 secondi, che non è quello che sto cercando.il modo più efficiente per ottenere, modificare e mettere un gruppo di entità con ndb

malato semplificare la mia modello per spiegare quello che faccio (che è abbastanza semplice comunque):

class Entity(ndb.Model): 
    title = ndb.StringProperty() 

keys = [key1, key2, key3, key4, ..., key500] 

entities = ndb.get_multi(keys) 

for e in entities: 
    e.title = 'the new title' 

ndb.put_multi(entities) 

ottenere e modifica non prende troppo tempo. Ho provato a get_async a entrare in un tasklet e qualsiasi altra cosa è possibile che cambia solo se il get o il forloop richiede più tempo.

ma ciò che mi preoccupa è che una put richiede fino a 50 secondi ...

qual è il modo più efficace per fare questa operazione (s) in una discreta quantità di tempo. ovviamente so che dipende da molti fattori come la complessità dell'entità, ma il tempo necessario per metterlo è davvero oltre il limite accettabile per me.
ho già provato operazioni asincrone, tasklet ...

risposta

8

Mi chiedo se fare piccoli gruppi di es. 50 o 100 entità sarà più veloce. Puoi provare a eseguire contemporaneamente questi tasklet

Ti consiglio anche di guardare questo con Appstats per vedere se questo mostra qualcosa di sorprendente

Infine, supponendo che questo usi l'HRD, è possibile che vi sia un limite al numero di gruppi di entità per lotto. Questo limite predefinito è molto basso. Prova a sollevarlo.

+1

tutte le entità sono nella stessa entità gruppo e dopo alcuni test devo dire che l'utilizzo di un tasklet per mettere le entità entro un task posticipato di 50 in batch rende questa operazione molto più veloce. Sto parlando di 5-10 secondi per l'aggiornamento completo che non è ancora quello che avevo in mente ma molto meglio di 50 secondi. – aschmid00

+1

Trovo che ciò sia sorprendente, se sono tutti nello stesso gruppo, se non avessimo gruppi diversi, raggiungeremo il limite di circa 1 scrittura/secondo/gruppo? – Alexis

+0

1 batch/secondo su ciò che sta ottenendo ... –

0

Suona come è stato progettato per MapReduce. Puoi farlo velocemente, ottenendo e modificando simultaneamente tutte le entità allo stesso tempo, ridimensionate su più istanze del server. Il costo sale però usando più istanze.

+0

ok ma questa è un'operazione su richiesta. Non sono sicuro se mapreduce sia una risposta alla mia domanda. ma potrei sbagliarmi – aschmid00

+0

Quando dici "su richiesta", suppongo tu intenda "richiesta HTTP avviata?". Ciò non ti impedisce di usare mapreduce. Tuttavia, controllare i risultati quando tutto è completato è un po 'più di una seccatura, ma non impossibile. – dragonx

+0

sì sono http la richiesta è stata avviata. e ho bisogno di controllare se l'azione/operazione è riuscita o meno. – aschmid00

0

Presumo che tu abbia il design dell'entità che desideri (cioè non ti chiederò cosa stai cercando di fare e come forse dovresti avere una grande entità invece di un gruppo di quelli piccoli che devi aggiornare tutto il tempo). Perché non sarebbe molto carino. (=

Cosa succede se si è utilizzata la Coda di attività? È possibile creare più attività e ciascuna attività può assumere come parametri URL le chiavi che è responsabile dell'aggiornamento e la proprietà e il valore da impostare. fino a pezzi gestibili e la richiesta dell'utente può tornare immediatamente mentre il lavoro avviene in background? Funzionerebbe?

+0

I * think * l'API MapReduce fondamentalmente lo fa per te.Prende il tuo lavoro, lo raggruppa in più attività, quindi distribuisce le attività in parallelo, in modo che venga completato più rapidamente. – dragonx

+0

il design dell'entità è fuori discussione e sì ho pensato di impostare i compiti ma poi avrei altri problemi come non sapere se l'operazione è andata avanti o meno, tutte le entità si trovano nello stesso gruppo di entità e stanno facendo il put) in lotti potrebbe causare problemi di contesa ... non riesco ancora a capire come un batch di entità (e non si parla di un milione di entità) possa richiedere quasi un minuto. queste non sono attività in background ma azioni eseguite da un utente, quindi ho bisogno di sapere se le azioni falliscono o hanno successo subito. – aschmid00

+0

Il suggerimento di GVR sull'utilizzo di AppStats è probabilmente vantaggioso per te, quindi. Quanti indici vengono scritti quando metti una delle tue entità? Quanti DB scrive è? Potrebbe essere un po 'obsoleto, ma controlla questo articolo per capire perché potrebbe volerci un po' per mettere una delle tue entità: https://developers.google.com/appengine/articles/life_of_write –

Problemi correlati