Ho uno computing map (con soft values) che sto utilizzando per memorizzare i risultati di un calcolo costoso.Computing map: valore di calcolo in anticipo
Ora ho una situazione in cui so che è probabile che una determinata chiave venga cercata nei prossimi secondi. Quella chiave è anche più costosa da calcolare rispetto alla maggior parte.
Vorrei calcolare preventivamente il valore, in un thread con priorità minima, in modo che quando il valore sia richiesto, esso verrà già memorizzato nella cache, migliorando il tempo di risposta.
cosa è un buon modo per fare questo in modo tale che:
- ho controllo sopra il filo (in particolare la sua priorità) in cui viene eseguito il calcolo.
- Il lavoro duplicato viene evitato, ovvero il calcolo viene eseguito una sola volta. Se l'attività di calcolo è già in esecuzione, il thread chiamante attende tale attività invece di calcolare nuovamente il valore (
FutureTask
implementa questa funzione. Con le mappe di calcolo di Guava ciò è vero se si chiama sologet
ma non se lo si mescola con le chiamate aput
.) - Il metodo "valore di calcolo in anticipo" è asincrono e idempotente. Se un calcolo è già in corso, dovrebbe tornare immediatamente senza attendere il termine del calcolo.
- Evitare l'inversione di priorità, ad es. se un thread con priorità alta richiede il valore mentre un thread con priorità media sta facendo qualcosa di non correlato ma l'attività di calcolo è accodata su un thread con priorità bassa, il thread con priorità alta non deve essere affamato. Forse questo potrebbe essere ottenuto aumentando temporaneamente la priorità dei thread di calcolo e/o eseguendo il calcolo sul thread chiamante.
Come potrebbe essere coordinato tra tutti i thread coinvolti?
Ulteriori informazioni
I calcoli nella mia richiesta sono operazioni di filtraggio di immagini, il che significa che sono tutti CPU-bound. Queste operazioni includono trasformazioni affini (che vanno da 50μs a 1ms) e convoluzioni (fino a 10ms.) Naturalmente l'efficacia delle varie priorità del thread dipende dalla capacità del sistema operativo di anticipare i compiti più grandi.
Si desidera precalcolare e memorizzare nella cache una chiave nella cache di precomputazione? Puoi, um ... memorizzarlo nella cache di precomputazione? –
@BlueRaja, che soddisfa i requisiti # 1 ma non # 2, # 3 o # 4. – finnw