2010-11-05 19 views

Respuesta

11

Ha malinterpretado la situación al compilar una lista con [H|T]. Es como usted dice que T no se copia pero tampoco es H. Todo lo que sucede es que una nueva celda de lista se antepone a T con una referencia a H como su encabezado (su cola es T). Al trabajar con listas, los únicos bits que se crean son las celdas de la lista real y nunca los datos en cada celda.

Lo mismo ocurre cuando se trabaja con dict. Cuando modifica (agrega/elimina elementos) en el dict, solo se modifica la estructura real dict y no los datos reales en el dict. También es inteligente para copiar solo la estructura dict que sea necesaria para realizar la modificación.

Entonces, sí, Erlang tiene estructuras de datos persistentes. En ese sentido, clojure es como Erlang (estuvimos mucho tiempo atrás).

+1

bien, no vamos a discutir aquí los punteros y los valores, la diferencia es clara para mí, el punto es cómo operar con grandes almacenes de clave-valor en memoria que tiene persistencia (por lo que no hay nada). Mencioné que en clojure durante la modificación de algún valor, solo se copia el camino de la raíz a ese valor (3-4 nodos) y tenemos dos árboles: el nuevo y el anterior. ¿Cómo podemos hacer esto en erlang? ¿Alguna estructura de la caja implementa dicho comportamiento? – adolgarev

+0

'A = SomeTree, B = cambio (A).'Ahora tiene el Árbol B y el Árbol A, donde 'B' es el nuevo y 'A' es el anterior. Usar' {A, B} 'coloca a ambos árboles en la misma tupla. ¿Es esto lo que querías saber? –

+0

nop, necesito A = SomeTree, B = cambio (A), y A y B comparten alguna pieza común, vea http://en.wikipedia.org/wiki/Purely_functional#Trees – adolgarev

2

En mi experiencia, las estructuras de datos para el módulo de la biblioteca no se degradan en el rendimiento o la presión de la memoria cuando se hacen más grandes.

Para un dict, utiliza una tabla hash dinámica como estructura interna de datos y el trabajo se realiza esencialmente solo en el depósito donde se realiza la modificación.

miré también en el módulo gb_trees donde me encontré con el siguiente comentario:

El comportamiento es logarítmica (como debe ser).

Y gb_trees son generalmente bastante rápidos, así que estoy bastante seguro de que no se están realizando muchas copias.

Generalmente, si implementa estructuras de datos como estas en un lenguaje como Erlang, se ocupa de los problemas de copia, por lo que no hay necesidad de preocuparse por las funciones generales de la biblioteca.


vuelvo a leer el artículo sobre estructuras de datos persistentes: en el sentido de este artículo, las estructuras de datos de Erlang son totalmente persistente y también confluently persistente.

+0

¿Y qué hay de las estructuras lineales? ¿Hay algo así como un vector (o un conjunto para el caso) que tienen esas garantías de rendimiento? –

+0

Sí, hay ... 'array' y 'set' ... ¿trataste de buscar en los documentos? –

Cuestiones relacionadas