es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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 biblioteca fastutil, 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 del HashMap que está usando actualmente. Aquí hay un ejemplo de cómo podría usar TrieMap para almacenar sus registros:

    import it.unimi.dsi.fastutil.objects.Object2IntMap;
    import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
    import it.unimi.dsi.fastutil.objects.ObjectIterator;
    import it.unimi.dsi.fastutil.triples.Triple;
    import it.unimi.dsi.fastutil.triples.TripleInt;
    
    public class RecordStore {
      private Object2IntMap<><string, integer,="" integer="">> records = new Object2IntOpenHashMap<>();
    
      public void putRecord(String key, int value) {
        // Parse the key into its component parts for use in the TrieMap
        String[] parts = key.split("/");
        String bucket = parts[2];
        int year = Integer.parseInt(parts[4]);
        int month = Integer.parseInt(parts[5]);
    
        // Add the record to the TrieMap
        records.put(new Triple<>(bucket, year, month), value);
      }
    
      public int getRecord(String key) {
        // Parse the key into its component parts for use in the TrieMap
        String[] parts = key.split("/");
        String bucket = parts[2];
        int year = Integer.parseInt(parts[4]);
        int month = Integer.parseInt(parts[5]);
    
        // Look up the record in the TrieMap
        return records.getInt(new Triple<>(bucket, year, month));
      }
    
      public void printRecords() {
        // Iterate over the records in the TrieMap and print them out
        ObjectIterator<><string>> iter = records.keySet().iterator();
        while (iter.hasNext()) {
          TripleInt<string> key = iter.next();
          int value = records.getInt(key);
          System.out.println(key.left + "/" + key.middle + "/" + key.right + ": " + value);
        }
      }
    }
    

    En este ejemplo, estamos usando una clase Triple de la biblioteca fastutil para representar las tres partes de la clave que queremos almacenar en el TrieMap (bucket, year y month). También estamos usando un Object2IntMap para almacenar los valores asociados con cada clave.

    Para agregar un registro a la RecordStore, llamaría al método putRecord con la clave completa y el valor asociado. El método putRecord extrae las partes relevantes de la clave y agrega el registro al TrieMap utilizando un Triple como clave.

    Para recuperar un registro de la RecordStore, llamaría al método getRecord con la clave completa. El método getRecord extrae las partes relevantes de la clave y busca el registro en el TrieMap utilizando un Triple 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,>

Comments are closed.