Pregunta

Si tengo una inmutable mapa que yo podría esperar (en un período muy corto de tiempo - al igual que unos pocos segundos) que la adición / eliminación cientos de miles de artículos de, es la norma HashMap una mala idea? Digamos que quiero pasar de 1 Gb de datos a través del mapa de <10 segundos de tal manera que el tamaño máximo del mapa en cualquier momento una vez que sólo 256Mb.

Me da la impresión de que el mapa mantiene una especie de "historia" pero lo haré siempre a acceder la última actualización de mesa (es decir, no paso el mapa alrededor), ya que es una empresa privada variable miembro de una Actor que se actualiza / visitada sólo desde dentro de reacciones.

Básicamente Sospecho que esta estructura de datos puede ser (parcialmente) la culpa para los problemas que estoy viendo en torno JVM que salen de la memoria cuando se lee en grandes cantidades de datos en un corto período de tiempo.

I estaría mejor con una aplicación de mapa diferente y, si es así, ¿qué es?

¿Fue útil?

Solución

Ouch. ¿Por qué tiene que usar un mapa inmutable? recolector de basura pobres! mapas inmutables generalmente requieren (log n) nuevos objetos por operación además de (log n), o que en realidad sólo se envuelven mapas de hash mutables y de cambios de la capa en la parte superior (que ralentiza las cosas y puede aumentar el número de creaciones de objetos).

La inmutabilidad es grande, pero esto no parece a mí como el momento de usarlo. Si yo fuera tú, me quedo con scala.collection.mutable.HashMap. Si necesita acceso concurrente, envolver el util.concurrent uno de Java en su lugar.

También puede ser que desee aumentar el tamaño de la generación joven en la JVM: -Xmn1G o más (suponiendo que se está ejecutando con -Xmx3G). Además, utilizar el rendimiento (en paralelo) recolector de basura.

Otros consejos

Eso sería horrible. Usted dice que siempre desea tener acceso a la última actualización de mesa, que significa que sólo necesita un efímera estructura de datos, no hay necesidad de pagar el costo de un persistente estructura de datos - es como el tiempo de negociación y la memoria para ganar "puntos de estilo" completamente discutibles. Estás no la construcción de su karma mediante el uso de estructuras ciegamente persistentes cuando no se requieren.

Además, una tabla hash es una estructura particularmente difícil hacer persistente. En otras palabras, "muy, muy lento" (básicamente es utilizable cuando se lee mucho más numerosos que escribe - y parece que hablar de muchas escrituras)

.

Por cierto, un ConcurrentHashMap podría no tener sentido en este diseño, dado que el mapa se accede desde un solo actor (eso es lo que entiendo de la descripción).

Scala está la llamada (*) Mapa inmutable se rompe allá del uso básico hasta Scala 2.7. No confía en mí, sólo tiene que buscar el número de entradas de puertas abiertas para él. Y la solución es simplemente "será reemplazado con algo más sobre el Scala 2.8" (que lo hizo).

Por lo tanto, si quieres un mapa inmutable de Scala 2.7.x, te aconsejo buscar en algo distinto de Scala. O simplemente utilizar TreeHashMap lugar.

(*) inmutable Mapa de Scala no es inmutable. Es una estructura de datos mutables internamente, lo que requiere gran cantidad de sincronización.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top