android - Graphhopper。我可以只加载部分图形文件以避免 OutOfMemory 错误吗?

标签 android graphhopper

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

我试过这个:为了节省内存,我删除了除汽车以外的所有特定于其他车辆的文件:nodes_ch_fastest_bike、shortcuts_fastest_bike、shortcuts_fastest_foot 等。

并修改了属性文件中的两行:

我删除了汽车以外的标志编码器​​:

graph.flag_encoders=car|speed_factor=5.0|speed_bits=5|turn_costs=false|version=1

并删除了汽车以外的权重

graph.ch.weightings=[fastest|car, shortest|car]

现在它正确加载了 :-)

问题是,我是否可以通过这种方式安全地修改属性文件(也许不需要删除文件?)以仅加载用户选择的车辆数据(如果用户在应用程序运行时更改车辆,图表关闭,然后修改属性文件以设置适当的编码器和权重,图表会再次加载)。

我注意到,除了 names 之外的剩余文件,即:nodes, edges, geometry, location_index 准备用于支持所有车辆(汽车、自行车、脚)的图形) 与仅为汽车准备的图形文件相比,大小有所不同。我想这与编码有关。虽然它似乎工作正常,但我不知道确切的图结构,我想避免任何不一致。

谢谢

更新: 我对其进行了测试,此解决方法适用于汽车,但在计算自行车和汽车的路线时有时会失败(最短和最快的加权)。异常:

java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:309) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.IllegalStateException: Calculating time should not require to read speed from edge in wrong direction. Reverse:true, fwd:false, bwd:false at com.graphhopper.routing.Path.calcMillis(Path.java:253) at com.graphhopper.routing.ch.Path4CH.expandEdge(Path4CH.java:56) at com.graphhopper.routing.ch.Path4CH.expandEdge(Path4CH.java:96) at com.graphhopper.routing.ch.Path4CH.expandEdge(Path4CH.java:96) at com.graphhopper.routing.ch.Path4CH.expandEdge(Path4CH.java:103) at com.graphhopper.routing.ch.Path4CH.expandEdge(Path4CH.java:96) at com.graphhopper.routing.ch.Path4CH.expandEdge(Path4CH.java:96) at com.graphhopper.routing.ch.Path4CH.expandEdge(Path4CH.java:96) at com.graphhopper.routing.ch.Path4CH.expandEdge(Path4CH.java:103) at com.graphhopper.routing.ch.Path4CH.processEdge(Path4CH.java:46) at com.graphhopper.routing.PathBidirRef.extract(PathBidirRef.java:92) at com.graphhopper.routing.DijkstraBidirectionRef.extractPath(DijkstraBidirectionRef.java:130) at com.graphhopper.routing.AbstractBidirAlgo.calcPath(AbstractBidirAlgo.java:64) at com.graphhopper.routing.AbstractRoutingAlgorithm.calcPaths(AbstractRoutingAlgorithm.java:120) at com.graphhopper.routing.template.ViaRoutingTemplate.calcPaths(ViaRoutingTemplate.java:110) at com.graphhopper.GraphHopper.calcPaths(GraphHopper.java:1098) at com.graphhopper.GraphHopper.route(GraphHopper.java:1003)

最佳答案

这应该没有问题,但目前还不是开箱即用的,只能通过您描述的黑客攻击或调整源代码。因为这是在我创建 this new issue 之前被要求和询问的

关于android - Graphhopper。我可以只加载部分图形文件以避免 OutOfMemory 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39809178/

相关文章:

Android Studio SVN 1.8 此客户端太旧,无法使用工作副本

java - 在 Android 中获取 View 的 alpha/不透明度

android - 在 OSM map 上实现离线路由

java - 在 Twitter4j 搜索上获取旧推文

java - 安卓 OpenGL : IllegalArgumentException use native order direct buffer

android - Hilt : java. lang.ClassNotFoundException: 找不到类 "com.kotlin20test.Hilt_MyApp"

android - Graphhopper,用于osmdroid离线路由的osmdroid

java - 在 jsprit 中使用带有日期的时间窗口

java - 有没有一种方法可以获取边所属方式的 ID?

android - Android Studio 中的 Graphhopper 0.3 未编译 : Dex Exception