#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;
}
}