2009-10-15 19 views
22

Me pregunto acerca de los parámetros para la construcción de un ConcurrentHashMap:ConcurrentHashMap parámetros de constructor?

  • initialCapacity es 16 por defecto (entendido).
  • loadFactor es 0.75 por defecto.
  • concurrencyLevel es 16 por defecto.

Mis preguntas son:

  • Qué criterios deben utilizarse para ajustar loadFactor arriba o hacia abajo?
  • ¿Cómo establecemos el número de subprocesos que se actualizan simultáneamente?
  • ¿Qué criterios se deben usar para ajustar concurrencyLevel hacia arriba o hacia abajo?

Además:

  • ¿Cuáles son las características de una buena aplicación código hash ? (Si una pregunta SO lo soluciona, solo haga un enlace)

¡Gracias!

+0

Gracias Dave, mucho mejor Voy a tomar mi cola de usted –

Respuesta

15

La respuesta breve: establezca la "capacidad inicial" aproximadamente a la cantidad de asignaciones que espera colocar en el mapa, y deje los otros parámetros en su valor predeterminado.

Respuesta larga:

  • factor de carga es la relación entre el número de "cubos" en el mapa y el número de elementos previstos;

  • 0,75 es por lo general un compromise-- razonable por lo que recuerdo, esto significa que con una buena función hash , en promedio, que esperamos alrededor de 1.6 redireccionamientos para encontrar un elemento en el mapa (o alrededor de esa figura);

    • cambiar el factor de carga cambia el compromiso entre redirecciones más para encontrar un elemento, pero menor pérdida de espacio-- pusieron 0,75 es realmente por lo general un buen valor;

    • en principio, establecer ConcurrencyLevel a el número de subprocesos simultáneos que esperar a tener la modificación del mapa, aunque esto no sobreestimar parecen tener un efecto negativo otra de perder la memoria (escribí un poco en ConcurrentHashMap performance hace un tiempo, en caso de que esté interesado )

de manera informal, el picadillo la función debería tener como objetivo esencial tener la mayor "aleatoriedad" posible en los bits. O más estrictamente, el código hash para un elemento dado debería dar a cada bit una probabilidad de fragmentación de aproximadamente el 50%. En realidad, es más fácil ilustrar esto con un ejemplo: de nuevo, puede que le interesen algunas cosas que escribí sobre how the String hash function works y hash function guidelines asociadas. La retroalimentación es obviamente bienvenida en cualquiera de estas cosas.

Una cosa también menciono en algún momento es que usted no tiene que ser demasiado paranoico en la práctica: si su función hash produce una cantidad "razonable" de aleatoriedad en algunos de los bits, a continuación, a menudo se estar bien En el peor de los casos, pegar datos representativos en una cadena y tomar el código hash de la cadena en realidad no funciona tan mal.

0

loadFactor: controles cuando la aplicación decide cambiar el tamaño de la tabla hash. Un valor demasiado alto desperdiciará espacio; un valor demasiado bajo resultará en costosas operaciones de cambio de tamaño.

concurrencyLevel: cuenta la aplicación para tratar de optimizar el número dado de hilos de escritura. De acuerdo con los documentos de la API, estar fuera de hasta un factor de 10 no debería tener mucho efecto en el rendimiento.

La concurrencia permitido entre actualización operaciones se guía por el argumento opcional concurrencyLevel constructor (por defecto 16), que se utiliza como una pista para encolado interno. La tabla está dividida internamente para tratar de permitir al número indicado de actualizaciones simultáneas y sin contención. Dado que la ubicación en las tablas hash es esencialmente aleatoria, la concurrencia real de variará. Lo ideal es que debe elegir un valor para acomodar tantos procesos como jamás al mismo tiempo modificar la tabla. El uso de un valor significativamente más alto de lo que necesidad puede desperdiciar espacio y el tiempo, y un valor significativamente menor puede conducir a la discordia hilo. Pero sobreestima y subestima dentro de un orden de magnitud no suelen tener mucho impacto notable.

Una buena implementación de hashcode distribuirá los valores de hash uniformemente en cualquier intervalo. Si el conjunto de claves se conoce de antemano, es posible definir una función hash "perfecta" que crea un valor hash único para cada tecla.

0

loadFactor se establece en 0,75 por defecto, qué criterios deberían utilizarse para ajustar esta arriba o hacia abajo?

Necesita información sobre cómo funcionan los mapas hash antes de que pueda entender cómo funciona esto. El mapa es esencialmente una serie de cubos. Cada valor en el mapa se pone en un cubo dependiendo de lo que es su código hash. El loadFactor significa que, si los cubos son más del 75% de su capacidad, el mapa debe ser redimensionado

concurrencyLevel se establece en el 16 por defecto, ¿cómo se establece el número de actualizar simultáneamente hilos? ¿Qué criterios se deben usar para ajustar esto hacia arriba o hacia abajo?

esto es pedir el número de roscas para que tengan previsto modificar el mapa al mismo tiempo (simultáneamente)

Para códigos hash, ver Effective Java

4

factor de carga de Joshua Bloch está principalmente relacionada con la calidad del hash función. Cuanto más cerca de cero sea el factor de carga, es menos probable que haya colisiones, incluso si la función hash no es tan buena. La compensación es que la huella de memoria es más grande. En otras palabras, HashMap no está distribuyendo las entradas en categorías separadas para cada código hash separado, sino que las está agrupando por proximidad, por lo que cuantos más segmentos tenga, cuanto más distribuida esté la distribución, menor será la probabilidad de que haya colisiones.

Por lo tanto, en definitiva, usted juega con el factor de carga para mejorar el tiempo de búsqueda o reducir la memoria, según sus necesidades y los objetos que está almacenando en el Mapa.

ConcurrencyLevel realmente depende de su aplicación. Si solo tienes dos o tres hilos ejecutándose en la aplicación, ahí tienes. Si usted es un servidor de aplicaciones con un número arbitrario de hilos, entonces necesita comprender cuál es su capacidad de carga y para qué punto desea optimizarla.

Una implementación de hashcode de buena calidad proporciona una distribución lo más amplia posible entre los posibles valores del objeto con el menor número de colisiones, respetando al mismo tiempo el contrato. En otras palabras, permite que HashMap (o Establecer según sea el caso) distribuya los objetos en depósitos separados, lo que hace que las búsquedas sean más rápidas.

Cuestiones relacionadas