Utilizzo Clojure per alcune attività di elaborazione dati su larga scala (sicuramente gigabyte di dati, in genere un sacco di array Java di grandi dimensioni memorizzati all'interno di vari costrutti Clojure/ref di STM).
Fintanto che tutto rientra nella memoria disponibile, non si dovrebbe avere un problema con quantità estremamente elevate di dati in un unico riferimento. Il ref stesso applica solo una piccola quantità fissa di overhead STM che è indipendente dalla dimensione di ciò che è contenuto al suo interno.
Un bel bonus extra deriva dalla condivisione strutturale che è costruito in strutture di dati standard di Clojure (mappe, vettori, ecc) - si può prendere una copia completa di una struttura di dati da 10 GB, modificare un elemento qualsiasi punto della struttura, e essere garantito che le strutture dati sia insieme richiedono solo una frazione superiore a 10 GB. Questo è molto utile, in particolare se si considera che a causa di STM/concorrenza si avranno potenzialmente diverse versioni dei dati creati in qualsiasi momento.
Bella risposta. Qual è il modello di accesso in lettura/scrittura della tua applicazione e la velocità di retrocessione della transazione? Inoltre, usi un ref o più ref? – Zubair
Ho molti lettori ma non molta contesa sulla scrittura, in genere solo uno scrittore. Non ho confrontato il tasso di ripetizione della transazione, ma sospetto che sia piuttosto basso. Io uso un riferimento per identità logica, ad es. "l'elenco di tutti i risultati di elaborazione fino ad ora" che viene aggiunto al completamento di varie attività – mikera