Mapa de Java en memoria con clave de cadena y reutilización de partes.
Tengo decenas de miles de registros en un mapa. Las claves del mapa son cadenas como s3://mybucket/some/path/2021/03/03/file.txt
, s3://mybucket/some/path/2021/03/04/file.txt
, el valor es 0
o 1
.
Hasta ahora he estado usando HashMap, pero el uso de memoria es demasiado alto, quiero reducirlo.
Estoy buscando algo que sea clave-valor y utilice la reutilización de partes de la clave.
Lo que viene naturalmente a la mente es utilizar una estructura de árbol para almacenar los prefijos.
¿Podría alguien señalarme una implementación adecuada, preferiblemente ligera?
davy.ai
Como experto en TI especializado en Java, Diccionarios, Trie y Prefix-Tree, aquí está mi respuesta a su pregunta:
Según sus requisitos, parece que una estructura de datos Trie o Prefix-Tree sería ideal para su caso de uso. Estas estructuras suelen ser más eficientes en memoria que un HashMap ya que almacenan las claves como un árbol de nodos, lo que permite la reutilización de partes de la clave.
En Java, hay varias implementaciones de Tries y Prefix-Trees disponibles. Una implementación ligera que podría considerar es la clase
TrieMap
de la bibliotecafastutil
, que proporciona una implementación eficiente en memoria de un Mapa basado en Trie.Para usar
TrieMap
, tendría que modificar su código para usar esta biblioteca en lugar delHashMap
que está usando actualmente. Aquí hay un ejemplo de cómo podría usarTrieMap
para almacenar sus registros:En este ejemplo, estamos usando una clase
Triple
de la bibliotecafastutil
para representar las tres partes de la clave que queremos almacenar en el TrieMap (bucket
,year
ymonth
). También estamos usando unObject2IntMap
para almacenar los valores asociados con cada clave.Para agregar un registro a la
RecordStore
, llamaría al métodoputRecord
con la clave completa y el valor asociado. El métodoputRecord
extrae las partes relevantes de la clave y agrega el registro al TrieMap utilizando unTriple
como clave.Para recuperar un registro de la
RecordStore
, llamaría al métodogetRecord
con la clave completa. El métodogetRecord
extrae las partes relevantes de la clave y busca el registro en el TrieMap utilizando unTriple
como clave.Por último, el método
printRecords
muestra cómo iterar sobre los registros en el TrieMap e imprimirlos.¡Espero que esto ayude! Déjeme saber si tiene alguna otra pregunta.</string,>