So di questo uno http://onjava.com/pub/a/onjava/2003/08/20/memoization.html ma c'è qualcos'altro?Quali sono le diverse tecniche di memoizzazione in Java?
risposta
Memoizzazione è anche facile con la pianura semplice typesafe Java.
si può fare da zero con le seguenti classi riutilizzabili.
io uso questi come cache la cui durata di vita sono la richiesta su una webapp.
Ovviamente utilizzare Guava MapMaker
se è necessaria una strategia di sfratto o più funzioni come la sincronizzazione.
Se è necessario memoizzare un metodo con molti parametri, è sufficiente mettere i parametri in un elenco con entrambe le tecniche e passare tale elenco come parametro singolo.
abstract public class Memoize0<V> {
//the memory
private V value;
public V get() {
if (value == null) {
value = calc();
}
return value;
}
/**
* will implement the calculation that
* is to be remembered thanks to this class
*/
public abstract V calc();
}
abstract public class Memoize1<P, V> {
//The memory, it maps one calculation parameter to one calculation result
private Map<P, V> values = new HashMap<P, V>();
public V get(P p) {
if (!values.containsKey(p)) {
values.put(p, calc(p));
}
return values.get(p);
}
/**
* Will implement the calculations that are
* to be remembered thanks to this class
* (one calculation per distinct parameter)
*/
public abstract V calc(P p);
}
E questo è usato come questo
Memoize0<String> configProvider = new Memoize0<String>() {
@Override
public String calc() {
return fetchConfigFromVerySlowDatabase();
}
};
final String config = configProvider.get();
Memoize1<Long, String> usernameProvider = new Memoize1<Long, String>() {
@Override
public String calc(Long id) {
return fetchUsernameFromVerySlowDatabase(id);
}
};
final String username = usernameProvider.get(123L);
Guava non è ancora stato approvato per il nostro ambiente, software finanziario ... – ranv01
Guava non è ancora stato approvato per il nostro ambiente. Software bancario ... Ma questo lo farà. Limiterò comunque la dimensione della mappa per evitare perdite di memoria. Non mi preoccupo degli sfratti poiché questo sarà conservato solo durante l'invocazione di un metodo. – ranv01
Mi piace il modo in cui il codice altamente testato non è approvato, ma qualcosa incollato su SO è :) –
Sì. Utilizzare caches da Guava.
Esempio:
import java.math.BigInteger;
import com.google.common.base.Preconditions;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
public class Fibonacci {
private static final LoadingCache<Integer, BigInteger> CACHE
= CacheBuilder.newBuilder().build(CacheLoader.from(Fibonacci::fib));
public static BigInteger fib(int n) {
Preconditions.checkArgument(n >= 0);
switch (n) {
case 0:
return BigInteger.ZERO;
case 1:
return BigInteger.ONE;
default:
return CACHE.getUnchecked(n - 1).add(CACHE.getUnchecked(n - 2));
}
}
}
MapMaker è ora obsoleto in favore di CacheBuilder: https://code.google.com/p/guava-libraries/wiki/MapMakerMigration – dzieciou
@dzieciou Ho finalmente aggiornato il codice a qualcosa che funziona con l'ultimo Guava (18.0 a ora attuale della scrittura). E questa volta, è testato! –
Per Memoize funzioni senza parametri, utilizzare Guava di Suppliers.memoize(Supplier)
. Per le funzioni con parametri, utilizzare CacheBuilder.build(CacheLoader)
con oggetti valore parametro come chiavi.
- 1. Quali sono le ultime tecniche DeBayer/Demosaicing
- 2. Quali sono le diverse proprietà disponibili in System.DirectoryServices.DirectorySearcher.PropertiesToLoad
- 3. Quali sono le tecniche prevalenti per abilitare le estensioni di codice utente in Python?
- 4. Quali sono le alternative alla VM Java?
- 5. Quali sono le tecniche per aggirare le regole di sicurezza del download del file IE?
- 6. Quali sono le monadi Scala standard diverse da Opzione?
- 7. Quali sono le ragioni tecniche alla base di Robot(). CreateScreenCapture() essendo così lento?
- 8. In SAS, quali sono le buone tecniche/opzioni per rilevare gli errori di sintassi?
- 9. Quali sono le tecniche di ottimizzazione del compilatore C++ in Visual Studio
- 10. Quali sono le librerie Java più importanti?
- 11. quali sono le tecnologie middleware java
- 12. Quali sono i vantaggi delle diverse endianness?
- 13. python: quali sono le tecniche efficienti per trattare i dati profondamente annidati in modo flessibile?
- 14. Quali sono le alternative per aggiornare automaticamente un'applicazione Java Swing?
- 15. Quali sono le variabili pure?
- 16. Quali sono le eccezioni controllate in Java/C#?
- 17. Quali sono le differenze in JIT tra Java e .Net
- 18. Quali sono le traduzioni for-each in Java tradotte?
- 19. Quali sono le fortune?
- 20. Quali sono le migliori pratiche di gestione della memoria Java?
- 21. Quali sono le ultime opzioni nei framework di registrazione Java?
- 22. Quali sono alcune tecniche per la migrazione di un'applicazione MFC di grandi dimensioni in WPF/.NET?
- 23. Quali sono le tecniche per consentire gli aggiornamenti sicuri del software nei sistemi incorporati
- 24. Quali sono alcune tecniche valide per combinare la protezione CSRF con le API RESTful?
- 25. Quali sono le ragioni tecniche alla base del "fiasco Itanium", se esiste?
- 26. Quali sono le tecniche accettate per rimanere connessi a un sito web?
- 27. Diverse tecniche di rendering nel modello di manubri emberjs
- 28. Quali sono le diverse icone dei punti di interruzione in Eclipse?
- 29. Quali sono i contenitori in Java
- 30. Memoizzazione persistente in Python
Questo esempio esegue la memoizzazione su tutti i metodi di un oggetto tramite un proxy. Ma la memoria tipica è una funzione al momento. Questa tecnica proxy sarebbe fastidiosa quando non si desidera memorizzare tutti i metodi di un oggetto. – lacroix1547