Domanda

Se ho un immutabile Map che avrei potuto aspettare (nel corso di un periodo molto breve di tempo - come un paio di secondi) di essere l'aggiunta / rimozione di centinaia di migliaia di articoli da, è lo standard di HashMap una cattiva idea? Diciamo che voglio passare 1Gb di dati attraverso la mappa in <10 secondi in modo che la dimensione massima della mappa in qualsiasi istante una volta è solo 256Mb.

ho l'impressione che la mappa mantiene una sorta di "storia" ma lo farò sempre accederanno l'ultimo aggiornamento della tabella (cioè non supero la mappa in giro), perché è un privato variabile membro di una Actor che viene aggiornato / accessibile solo dall'interno reazioni.

Fondamentalmente sospetto che tale struttura di dati può essere (parzialmente) in difetto per le questioni sto vedendo in giro JVM di uscire di memoria durante la lettura in grandi quantità di dati in breve tempo.

Sarei meglio con un'implementazione mappa diversa e, in caso affermativo, che cosa è?

È stato utile?

Soluzione

Ouch. Perché è necessario utilizzare una mappa immutabili? Povero garbage collector! mappe immutabili in genere richiedono (log n) nuovi oggetti per operazione, oltre a (log n), o in realtà solo avvolgono mappe hash mutevoli e di modifiche strato sopra (che rallenta le cose e può aumentare il numero di creazioni di oggetti).

L'immutabilità è grande, ma questo non sembra a me come il tempo di usarla. Se fossi in te, mi piacerebbe restare con scala.collection.mutable.HashMap. Se avete bisogno di accesso concorrente, avvolgere quella util.concurrent Java invece.

Si potrebbe anche decidere di aumentare la dimensione delle giovani generazioni nella JVM: -Xmn1G o più (supponendo che si sta eseguendo con -Xmx3G). Inoltre, utilizzare il throughput (parallelo) garbage collector.

Altri suggerimenti

Questo sarebbe terribile. Tu dici che vuoi sempre per accedere l'ultimo aggiornamento tavolo, che significa che è necessario solo un effimero struttura dati, non v'è alcuna necessità di pagare il costo per un persistente struttura dati - è come se il tempo e la memoria di trading per guadagnare completamente discutibili "punti stile". Sei non costruire il vostro karma utilizzando strutture ciecamente persistenti quando non sono chiamati per.

Inoltre, una tabella hash è una struttura particolarmente difficile fare persistente. In altre parole, "molto, molto lento" (in pratica è utilizzabile quando si legge molto più numerosi scrive - e ti sembra di parlare di molte scritture)

.

Tra l'altro, un ConcurrentHashMap non avrebbe senso in questo progetto, dato che la mappa si accede da un solo attore (che è quello che ho capito dalla descrizione).

di Scala cosiddetta (*) immutabile Mappa è rotto al di là di utilizzo di base fino a Scala 2.7. Non fidarti di me, basta guardare il numero di biglietti aperti per esso. E la soluzione è solo "sarà sostituito con qualcos'altro su Scala 2.8" (che ha fatto).

Quindi, se si desidera una mappa immutabile per Scala 2.7.x, vorrei consigliare a cercarla in qualcosa di diverso da Scala. O semplicemente utilizzare al posto TreeHashMap.

(*) della Scala immutabile Mappa non è davvero immutabile. Si tratta di una struttura di dati mutevole internamente, che richiede molta sincronizzazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top