public KDNode loadNode(long filePos) throws IOException{

        // Si esta en memoria principal
        if(elements.containsKey(filePos)){
            improvePriority(filePos);
            return elements.get(filePos);
        }

        // Si no esta en memoria principal...
        // se supone que numOfElements no deberia ser menor que numOfBuffer
        // ya que si esto pasa, el nodo deberia estar en memoria principal

        if(numOfElements < numOfBuffers){
            readBlockFromFile(filePos, buffer);
            priority.addFirst(filePos);
            bufWasModified.put(filePos, false);
            numOfElements++;
            KDNode temp = new KDNode(buffer);
            elements.put(filePos, temp);
            return temp;
        }

        // no esta en memoria principal... liberar espacio
        long exit = priority.pollLast();
        KDNode exitNode = elements.get(exit);

        if(bufWasModified.get(exit)){


            // Guardamos en disco antes de eliminar si es distinto a lo que esta en memoria secundaria
            exitNode.writeToBuffer(buffer); // TODO


            writeBlockToFile(buffer, exit);
        }

        //procedemos a liberar espacio
        elements.remove(exit);
        bufWasModified.remove(exit);

        // Cargamos el nodo en memoria principal
        readBlockFromFile(filePos, buffer);
        KDNode temp = new KDNode(buffer);
        priority.addFirst(filePos);
        bufWasModified.put(filePos, true);
        elements.put(filePos, temp);

        // Retornamos el nodo en cuestion
        return temp;
    }