2009-09-27 6 views

risposta

12

ETS non è garbage collection poiché è archiviato in un heap al di fuori dei processi di erlang. Ciò significa che quando si inserisce qualcosa in ets viene copiato in esso e quando lo si estrae, si ottiene una copia nel processo. Fare molte ricerche su ets può quindi portare a un eccesso di consing nel tuo processo (ma questo è rilevante solo per througput molto alti).

Il dizionario del processo è garbage collector. È memorizzato nell'heap del processo stesso. Quindi quando guardi le cose in esso ottieni un riferimento allo stesso identico valore che hai inserito. I valori memorizzati nel dizionario del processo non vengono compattati.

Entrambi gli approcci non sono puri, cioè hanno effetti collaterali. Sì, è cattivo, e sì, non è per questo che abbiamo entrambe le alternative.

+1

Quasi tutti i libri di Erlang dicono che dovremmo stare lontano dalla biblioteca processo, ma penso che con ETS non è molto diverso. –

+14

"Quasi tutti i libri di Erlang" ... vuol dire due su tre? =) – Zed

9

Vantaggi di ETS oltre dizionario processo sono:

  • Altri processi possono accedere alla tabella ETS direttamente
  • ETS CONFERISCE ricerca/servizi di corrispondenza/iterazione, mentre il dizionario processo è solo un archivio di valori-chiave .
  • È possibile salvare/caricare tabelle in file in un unico passaggio
  • Se il processo proprietario muore, la tabella può essere ereditata da qualcun altro, quindi i dati non vengono persi.
9

ETS si comporta più o meno come se la tabella fosse in un processo separato e le richieste siano messaggi inviati a tale processo. Sebbene non sia implementato con i processi, le proprietà di ETS sono modellate in questo modo. È infatti possibile implementare ETS con i processi.

Ciò significa che le proprietà degli effetti collaterali sono coerenti con il resto di Erlang.

Il dizionario del processo è come nient'altro in Erlang e l'aggiunta è stato un grosso errore. Non c'è motivo di usare il dizionario dei processi invece di uno dei dizionari locali di processo come dict o gb_trees.

+2

Immagino che una differenza tra ETS e "ETS basato sui processi" sarebbe che al primo si può accedere in modo veramente concorrente quando si usano i blocchi fini, mentre il secondo imporrà sempre la sincronizzazione (serializzazione a.k.a.). – Zed

+1

Non proprio da un processo in quanto l'accesso a ETS è sincrono quindi il processo di "chiamata" deve attendere fino a quando ottiene una "risposta" da ETS. La differenza è che il dizionario dei processi sarà sempre uno nel contesto di quel processo, mentre ETS sarà un accesso sincronizzato ai dati condivisi. – rvirding

+1

Vedo che rvirding ha commentato, ed è uno dei guru di Erlang, ma su questo punto io umilmente differisco. Vedo un dizionario di processo (e utilizzato) per le funzioni di pulizia all'interno di un processo. A volte è necessario memorizzare lo stato all'interno di un processo per una funzione che non fa parte della funzione principale dei processi, ad esempio un logger può mantenere lo stato e mettere lo stato del logger nella logica dell'applicazione principale è scorretto. –

2

Non c'è dubbio che ETS ha molte più funzionalità ed è più sofisticato. Ma ...

  • Mentre le operazioni di aggiornamento/consultazione dei dizionari processo si muovono solo i riferimenti, non i dati interi (vedi la risposta precisa da Christian), può essere molto più veloce, soprattutto per le grandi strutture di dati. Una volta ho refactored una parte del codice per mantenere le strutture di dati grandi e frequentemente accessibili in proc. dict al posto di ETS e abbiamo avuto un 30% di accelerazione in quella parte del codice.

  • In molti casi i dati sono accessibili solo da un singolo processo. In quel caso non vedo una grande differenza teorica tra proc.dict ed ETS. Entrambi servono a mantenere gli effetti collaterali nella memoria. Inoltre, è possibile accedere al proc.dict di un altro processo come

    process_info (whereis (net_kernel), dizionario).

Problemi correlati