第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用于尋路的mgo優(yōu)化

用于尋路的mgo優(yōu)化

Go
達(dá)令說 2021-11-15 16:42:34
我在 Go 中實(shí)現(xiàn)了一個 A* 算法來找到地圖上兩個坐標(biāo)之間的路徑。地圖數(shù)據(jù)是使用 mgo 從 MongoDB 集合中獲取的。然而,它非常緩慢。對于 1000 米的路線,它大約需要 4 秒。我對算法的不同部分進(jìn)行了計時,并得出結(jié)論,瓶頸在于從數(shù)據(jù)庫中獲取。或者更準(zhǔn)確地說:從二進(jìn)制數(shù)據(jù)到 Go 能夠理解的數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)換。我盡量少做請求,多線程處理請求以使其更快,這在一定程度上有所幫助。但它并沒有我希望的那么快。似乎我在做一些根本錯誤的事情。任何建議都會有所幫助。mongoDB 中的數(shù)據(jù)結(jié)構(gòu):(從 OSM 獲取的節(jié)點(diǎn)){ "_id" : NumberLong(194637483),  "lat" : 55.7079899,   "lon" : 13.3756414,  "neighbours" : [ NumberLong(1566264689), NumberLong(1566264806) ] }Go中的數(shù)據(jù)結(jié)構(gòu)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"`}獲取一條數(shù)據(jù)的代碼: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()    }}
查看完整描述

1 回答

?
繁花如伊

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個贊

根據(jù)現(xiàn)有的信息,我可以推斷出:

  1. 您的機(jī)器似乎很慢,也許是嵌入式設(shè)備?

您調(diào)用的階段db-fetch實(shí)際上并未訪問數(shù)據(jù)庫。唯一c.Find(...)能做的就是建立一個*mgo.Query價值。該方法有 6 行。這不應(yīng)超過一毫秒。除非在數(shù)據(jù)庫對象的內(nèi)部會話狀態(tài)上存在爭用,否則情況似乎并非如此,因?yàn)槟皇褂昧?4 個 goroutine。

  1. 瓶頸似乎是網(wǎng)絡(luò)和/或反射

query.All(&nodes)是在您的數(shù)據(jù)庫上實(shí)際執(zhí)行查詢的地方。此外,這個階段會分配它需要的節(jié)點(diǎn)切片,然后通過反射將 bson 迭代解碼到您的結(jié)構(gòu)定義中。

  1. 你可以嘗試的一件事: *mgo.iter

而不是query.All(...)您可以使用query.Iter()獲取 a*mgo.Iter并在您的數(shù)據(jù)集上批量迭代。這可能會通過更好地隨時間分配網(wǎng)絡(luò)負(fù)載來提高性能。

  1. 使用地理空間索引,Mongo 支持

請參閱文檔。也許你已經(jīng)在這樣做了。如果沒有,它可能會縮短查找時間。

  1. 將您的象限遞歸地拆分為子象限。

我認(rèn)為這是顯而易見的。分而治之吧?:)


查看完整回答
反對 回復(fù) 2021-11-15
  • 1 回答
  • 0 關(guān)注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號