我在 Go 中实现了一个 A* 算法来找到地图上两个坐标之间的路径。地图数据是使用 mgo 从 MongoDB 集合中获取的。
然而,它非常缓慢。对于 1000 米的路线,它大约需要 4 秒。我对算法的不同部分进行了计时,并得出结论,瓶颈在于从数据库中获取。或者更准确地说:从二进制数据到 Go 能够理解的数据结构的转换。
我尽量少做请求,多线程处理请求以使其更快,这在一定程度上有所帮助。但它并没有我希望的那么快。
似乎我在做一些根本错误的事情。任何建议都会有所帮助。
mongoDB 中的数据结构:(从 OSM 获取的节点)
{ "_id" : NumberLong(194637483),
"lat" : 55.7079899,
"lon" : 13.3756414,
"neighbours" : [ NumberLong(1566264689), NumberLong(1566264806) ]
}
Go中的数据结构
type Node struct {
ID int64 `bson:"_id" json:"id"`
Lat float64 `bson:"lat" json:"lat"`
Lon float64 `bson:"lon" json:"lon"`
Neighbours []int64 `bson:"neighbours" json:"neighbours"`
}
获取一条数据的代码:
func addToBufferLong(buffer *WriteLockMap, session *mgo.Session, at, goal geo.Node, lowerLat, higherLat, lowerLon, higherLon float64) {
c := session.DB("collectionName").C("nodes")
query := c.Find(bson.M{"lat": bson.M{"$gt": lowerLat, "$lt": higherLat}, "lon": bson.M{"$gt": lowerLon, "$lt": higherLon}})
var nodes []geo.Node
query.All(&nodes)
for _, node := range nodes {
tmp := PathNode{0, node.DistanceTo(goal), 0, node}
buffer.Lock()
buffer.m[node.ID] = tmp
buffer.Unlock()
}
}
繁花如伊
相关分类