Кэширование графика с помощью guava

#caching #guava

#кэширование #guava

Вопрос:

Я работаю над алгоритмом маршрутизации, для которого я должен сначала вычислить график. В текущей версии моей программы получение маршрута занимает более 8 секунд, в основном потому, что я создаю график с каждым запросом маршрута. Вот почему я ищу способ, который мог бы ускорить процесс поиска маршрута. После проведения некоторых исследований я понял, что могу вычислить график один раз, затем загрузить его в память и получить к нему доступ оттуда. Все звучит круто и просто, но когда я пытаюсь применить это на практике, я застреваю.

Я выбрал guava от Google в качестве метода кэширования, я слышал, что это довольно просто, но, хоть убейте, я не понимаю, как я могу заставить это работать для всего графика, мои знания в этой области очень ограничены. Я могу сделать это для одной строки, но понятия не имею, как я могу сделать это для объекта Graph.

Я нашел в документации нечто подобное, но на самом деле я не вижу способа настроить это.

     LoadingCache<String, Graph> graphs = CacheBuilder.newBuilder()
           .maximumSize(1000000)
           .build(
               new CacheLoader<String, Graph>() {
                 public Graph load(String key) {
                   return createExpensiveGraph(key);
                 }
               });


   private static Graph createExpensiveGraph(String key){
          LineStringGraphGenerator graphGen = new  LineStringGraphGenerator();
          for (ListIterator l = lines.listIterator(); l.hasNext(); ){
            LineString line_graph = (LineString) l.next();
            graphGen.add(line_graph);
          } 
          networkGraph = graphGen.getGraph();

          return networkGraph;
   }
  

Комментарии:

1. Итак, чего не хватает? Код для создания графика?

2. Нет, у меня действительно есть код, но будет ли это все?

3. Какая часть не работает?

4. Хммм, я не понимаю часть о том, как мне получить график из кэша для дальнейшей его обработки? Также я добавил функцию создания графика в основной пост.

5. В вашем случае: graphs.get(key) .

Ответ №1:

Ваша проблема может быть решена с помощью Google, разместите сообщение типа: это или этот другой представляют собой введение в Guava Cache.

Основным примером является:

 public class YourCacheClass {

    private final LoadingCache<String, Graph> graphs;
    private static final int MAX_SIZE = 1000000;

    YourCacheClass() {
        super();
        this.graphs = CacheBuilder.newBuilder()
            .maximumSize(MAX_SIZE)
            .build(
                    new CacheLoader<String, Graph>() {
                        public Graph load(String key) {
                            return createExpensiveGraph(key);
                        }
                    });
    }

    /** Method to get graph */
    public Graph getGraph(String key) throws ExecutionException {
        return this.graphs.get(key);
    }

    private Graph createExpensiveGraph(String key) {
        //your code to load Graph
        return graph;
    }

}