Graphhopper。我是否可以仅加载部分图表文件以避免OutOfMemory错误?

时间:2016-10-01 16:51:51

标签: android graphhopper

我已经在不同的设备上测试Android上的graphhopper几周了。今天我在GraphHopper load(...)函数执行期间遇到了OutOfMemory错误。这种情况发生在小米Mi4手机上。图表以最快和最短的权重导出汽车,自行车和脚。所有图形文件都超过1,17GB。

我试过这个:为了节省内存,我删除了除汽车以外的所有其他车辆文件:nodes_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)               at java.util.concurrent.FutureTask.setException(FutureTask.java:223)               在java.util.concurrent.FutureTask.run(FutureTask.java:242)               在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:234)               在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)               at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588)               在java.lang.Thread.run(Thread.java:818)        引起: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.AbstractBidirAlgo.calcPath(AbstractBidirAlgo.java:64)               在com.graphhopper.routing.AbstractRoutingAlgorithm.calcPaths(AbstractRoutingAlgorithm.java:120)               在com.graphhopper.routing.template.ViaRoutingTemplate.calcPaths(ViaRoutingTemplate.java:110)               at com.graphhopper.GraphHopper.calcPaths(GraphHopper.java:1098)               在com.graphhopper.GraphHopper.route(GraphHopper.java:1003)

1 个答案:

答案 0 :(得分:1)

这应该没有问题,但目前还没有开箱即用,只有您描述的黑客或调整源代码。因为在我创建this new issue

之前请求并询问了这个问题