He estado pensando mucho acerca de la transformación de las colecciones de datos o fuentes de datos. Evaluación diferida es particularmente útil para los valores que son caros de calcular. La pereza puede ser codificada de forma manual, o al horno en una API como una colección o transformación. La implementación de algunos tipos de pereza es más caro que otros. A veces la pereza puede ser inapropiado, por ejemplo, cuando una conexión de base de datos abierta y esperando para ser leído de. No pude encontrar grados de la pereza con una búsqueda rápida en la web, así que estoy definiendo algunos aquí
niveles de evaluación Pereza
- 0:. Eager
- La fuente de datos completo se evalúa inmediatamente. La mayoría de los estados en la mayoría de idiomas funcionan de esta manera la mayor parte del tiempo, porque esa es la forma en que los códigos de bytes y el hardware subyacentes están diseñados para trabajar. Evaluación Deseoso de una colección se puede hacer al mismo tiempo desde el interior de la colección. El
reducir
se implementa de esta manera en Clojure - 1:. Retraso
- Los datos fuente completo se evalúa en el primer uso de los resultados. Ejemplos: patrones constructor, isTrueForAll (), foreach (), Java 8 transformaciones de recolección, por defecto Hibernate unieron mesa de carga. Evaluación diferida de una colección se puede hacer al mismo tiempo desde el interior de la colección
- 2:. Chunked
- Los datos de origen se evalúa en los trozos de tamaño mínimo para cada llamada: filter (), contiene (). Este nivel se define por asintótica máxima pereza de los niveles 1 y 3 y mínimo. Véase más abajo para más
- 3:. Incremental
- se evaluó un máximo de un punto por llamada: mapa (). Este es el valor predeterminado para Clojure. Evaluación incremental no se puede hacer al mismo tiempo desde el interior de la colección porque eso requeriría evaluar más de un elemento a la vez.
Nivel 2
es raro. Un filtro que nada, o sólo el último elemento coincide con eficacia es el nivel 1. Un filtro que coincide con cada elemento es efectivamente el nivel 3. Yo lo llamo el nivel 2 en ambos casos debido a su rango. Creo que es importante reconocer el nivel 2 como un nivel único porque está fragmentada. Una tabla hash equilibrada de un cierto tamaño y la carga podría evaluar un cubo a la vez para contains () y ser muy fiable de nivel 2 sin ser jamás el nivel 1 o de nivel 3. El procesamiento simultáneo de Nivel 2 puede ser posible dentro de una colección, en algunas circunstancias, pero no es práctico en la mayoría de las circunstancias (porque el tamaño del pedazo normalmente no pueden ser conocidas de antemano).
Para un solo valor del elemento, Lazy los niveles 1, 2 y 3 son indistinguibles – es bien Eager o es perezoso – período. Dos elementos pueden ser de 1 ó Lazy Lazy 3. Con 3 o más elementos, Lazy 2 se convierte en una descripción significativa de la pereza. Los resultados de la evaluación perezosa pueden almacenar en caché, sobre todo cuando esa evaluación es caro y los valores serán reutilizados. Clojure secuencias son perezosos y cache / memoized por defecto. Esto es muy seguro, pero algo intensivo en recursos. También requiere atención con algunas fuentes de datos con el fin de procesar sólo un subconjunto finito de los datos que se ajuste en la memoria.problemas de aplicación
¿Qué es una visión
La interfaz Iterator en Java y otros lenguajes no es adecuado para el uso al mismo tiempo. Dispone de 2 métodos: hasNext () y next () y le permite enumerar un origen de datos subyacente de una vez. Algunas fuentes de datos están ordenados, y algunos no lo son – el iterador respeta que
El problema es que incluso si sincroniza ambos métodos, dos hilos pueden llamar tanto hasNext () cuando sólo hay un elemento. izquierda. En cualquier momento, un cliente roto puede llamar a next () sin llamar hasNext (). En cada uno de estos casos, un subproceso que llama hasNext () y se pone «verdadero» todavía puede llamar a next () y obtener NoSuchElementException. ¡Qué asco!
Una mejor interfaz, que voy a llamar a View (posiblemente porque no he entendido bien Paul Phillips de usar esa palabra). Se puede perezosamente evaluado o iterar sobre una colección previamente dado cuenta, pero tiene un único método: next () que puede devolver el siguiente elemento (sea o no su nulo) o un valor centinela: USED_UP. Esto es 100% seguro para subprocesos. Un número arbitrario de hilos segura y rápida puede llamar a: T item = next ();
while (item = USED_UP!) {
/ / Hacer algo con el tema
item = next ();}