Cosas de Mapas

Al Construir la librería Bikey, para hacer que fuera lo más fácil y natural de usar para cualquier programador con experiencia en Java, intenté que el API siguiera los mismos patrones y semánticas que la librería de Collecciones de Java. Para eso estudié y repliqué el comportamiento (e incluso Javadoc) del API de Map.

Al hacerlo, me di cuenta de una cosa de la que no era consciente (o nunca me había planteado): los métodos Collection<V> values(), Set<K> keySet(), y Set<Map.Entry<K,​V>> entrySet() devuelven vistas del mapa:

Leer más...
Bikey

TL;DR: en este post os presento Bikey una librería de colecciones de Java para crear Maps y Sets cuyos elementos tienen dos claves, consumiendo desde un 70%-85% a un 99% menos de memoria que con estructuras de datos habituales. Es Open Source, publicada en https://github.com/jerolba/bikey y está disponible en Maven Central.

En dos de mis últimos artículos hablando sobre HashMaps planteaba los problemas que hay cuando gestionamos información referenciada con una clave formada por dos valores: Map<Pair<K1, K2>, V>. Si analizamos las opciones disponibles vemos que el consumo por unidad de información es relativamente elevada.

¿Por qué se consume tanta memoria si el 60% de la información está repetida?.

¿Hay alguna librería que implemente mapas y sets con clave compuesta de forma eficiente? Yo no la he encontrado.

Leer más...
Midiendo el uso real de memoria: JMnemohistosyne

TL;DR: en este post os presento JMnemohistosyne una pequeña utilidad para calcular el histograma de clases con la memoria consumida en una sección de código.

En mis dos últimos artículos tenía una especial preocupación por conocer cuál era el consumo de memoria de algunas estructuras de datos y cómo se distribuía el espacio ocupado entre las distintas clases que las forman.

En mi caso concreto, dado un fragmento de código necesitaba averiguar:

  • ¿Cuánta memoria han consumido los objetos que se han instanciado y quedan residentes en memoria?
  • ¿Cuántas instancias de cada clase existen?
  • ¿Cuánta memoria consumen?
Leer más...
Mapas con clave compuesta

En mi último post hablé de los problemas de usar una función hash incorrecta cuando guardas un objeto con clave compuesta en un HashMap de Java, pero me quedé con la duda: ¿qué estructura de datos es mejor a la hora de indexar esos objetos?

Siguiendo con el mismo ejemplo hablaré de productos y tiendas, y usaré sus identificadores para formar la clave del mapa. Las estructuras de datos propuestas son:

  • Un único mapa con una clave que contenga sus índices: HashMap<Tuple<Integer, Integer>, MyObject>, al que llamaré TupleMap.
  • Un mapa anidado: HashMap<Integer, HashMap<Integer, MyObject>>, al que llamaré DoubleMap.
Leer más...
Hashing y mapas

Tranquilos, no voy a hablar ni de blockchain ni de geoposicionamiento, sino de un tema más aburrido y básico: sobre funciones hash y hash maps.

En este post os contaré un caso real en Nextail, donde el cambio de una sóla línea de código relacionada con una función hash cambió el rendimiento de una aplicación, tanto por consumo de CPU como de memoria.

Leer más...