Graphhopper. Могу ли я загрузить только часть графических файлов, чтобы избежать ошибки OutOfMemory?
Я тестировал Graphhopper на Android в течение нескольких недель на разных устройствах. Сегодня я получил ошибку OutOfMemory во время выполнения функции загрузки (...) GraphHopper. Это происходит на телефоне Xiaomi Mi4. График экспортируется для автомобилей, велосипедов и пешеходов с самыми быстрыми и самыми короткими весами. Все графические файлы более 1,17 ГБ.
Я попробовал это: чтобы сэкономить память, я удалил все файлы, относящиеся к другим транспортным средствам, кроме автомобиля: node_ch_fastest_bike, shortcuts_fastest_bike, shortcuts_fastest_foot и т. Д.
и изменил 2 строки в файле свойств:
Я убрал флаговые кодеры, кроме автомобиля:
graph.flag_encoders=car|speed_factor=5.0|speed_bits=5|turn_costs=false|version=1
и убрал утяжелители кроме машины
graph.ch.weightings=[fastest|car, shortest|car]
Теперь он загружен правильно:-)
Вопрос в том, могу ли я безопасно изменить файл свойств таким образом (может быть, удаление файлов было ненужным?), Чтобы загружать только данные транспортного средства, выбранные пользователем (если пользователь изменяет транспортное средство во время выполнения приложения, график закрывается, то файл свойств изменяется, чтобы установить правильные кодировщики и веса и график загружается снова).
Я заметил, что остальные файлы, кроме имен, то есть: узлы, ребра, геометрия, location_index, подготовленные для графа, поддерживающего все транспортные средства (автомобиль, велосипед, нога), различаются по размеру по сравнению с файлами графа, подготовленными только для автомобиля. Я полагаю, это связано с кодированием. Хотя кажется, что он работает правильно, я не знаю точную структуру графа, и я хотел бы избежать любых противоречий.
Спасибо
ОБНОВЛЕНИЕ: я проверил это, и этот обходной путь работает для автомобиля, но иногда терпит неудачу при вычислении маршрута для велосипедных и автомобильных транспортных средств (как самый короткий и самый быстрый вес) Исключение:
java.lang.RuntimeException: произошла ошибка при выполнении doInBackground() на android.os.AsyncTask$3.done(AsyncTask.java:309) на java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) в Java.util.concurrent.FutureTask.setException(FutureTask.java:223) в java.util.concurrent.FutureTask.run(FutureTask.java:242) в android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:2) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) в java.lang.Thread.run(j). Вызывается: java.lang.IllegalStateException: Расчет времени не должен требовать чтения скорости от края в неправильном направлении. Реверс:true, fwd:false, bwd:false в com.graphhopper.routing.Path.calcMillis(Path.java:253) в com.graphhopper.routing.ch.Path4CH.expandEdge(Path4CH.java:56) в com.graphhopper.routing.ch.Path4CH.expandEdge(Path4CH.java:96) в com.graphhopper.routing.ch.Path4CH.expandEdge (Path4CH.java:96) в com.graphhopper.routing.ch.Path4CH.expandEdge (Path4CH. Java:103) в com.graphhopper.routing.ch.Path4CH.expandEdge (Path4CH.java:96) в com.graphhopper.routing.ch.Path4CH.expandEdge (Path4CH.java:96) в com.graphhopper.routing.ch.Path4CH.expandEdge (Path4CH.java:96) в com.graphhopper.routing.ch.Path4CH.expandEdge(Path4CH.java:103) в com.graphhopper.routing.ch.Path4CH.processEdge(Path4CH.java:46) в com.graphhopper.routing.PathBidirRef.extract(PathBidirRef.java:92) в com.graphhopper.routing.DijkstraBidirectionRef.extractPath(DijkstraBidirectionRef.java:130) в com.graphhopper.routing.AbstractBjirAlgA at com.graphhopper.routing.AbstractRoutingAlgorithm.calcPaths(AbstractRoutingAlgorithm.java:120) в com.graphhopper.routing.template.ViaRoutingTemplate.calcPaths(ViaRoutingTemplate.java:110) в com.graphhopper.GraphHopper.calcPaths(GraphHopper.java:1098) в com.hog.java:1003)
1 ответ
Это должно быть возможно без проблем, но в настоящее время не из коробки и только с хаком, который вы описали, или настройкой исходного кода. Как это было запрошено и задано, прежде чем я создал этот новый вопрос