2016-10-12 55 views
2

我正在開發一個由node.js中的服務器組成的應用程序,基本上它是一個偵聽傳入連接的套接字。性能套接字nodejs + mysql

到達我的服務器的數據來自GPS跟蹤器(約30個),每個分鐘每分鐘發送5條記錄,因此在一分鐘內將有5*30 = 150記錄,在一小時內我將有150*60 = 9000記錄,日9000*24 =216000和一個月216000*30 = 6.480.000萬條記錄。

除了緯度和經度,我必須在數據庫(MySql)中存儲每個跟蹤器的累積距離。每個跟蹤器發送到服務器位置,每次接收數據時我都必須計算兩個點之間的kms(當數據量達到數百萬條記錄時,減少對數據庫的處理)。

所以問題是,總結公里和存儲它的正確方法是什麼?

我想總結整個數據庫不是一個解決方案,因爲在數百萬條記錄中會很慢。也許,每次我必須存儲一個新點(每分鐘150次),可以在數據庫中選擇最後一個記錄,然後將累積公里和新距離計算在一起?

+1

您可以使用內存數據存儲,如[Redis](http://redis.io)來存儲累積距離。這是一個關鍵 - >值存儲器,因此您可以使用跟蹤器ID作爲密鑰,然後使用add方法將新距離添加到運行總計。 –

+0

同意@DanielWaghorn我們在工作中使用Redis和MongoDB的組合,並且每天處理500k條記錄。 Redis是一個很好的解決方案,用於保存鍵/值數據,否則這些數據在數據庫查詢中會很昂貴。在你的情況下,你將每分鐘計算點之間的距離,然後將該總和作爲你的redis存儲中特定鍵的新值。 Redis是原子性的並且同步任何寫入,聽起來像是您項目的理想用例。我們還設置了一個定期將值寫入磁盤的cron作業,以防redis存儲崩潰(尚未發生) – Alex

回答

0

2.5插入每秒只是一個適度的速度。 6M記錄/月 - 沒問題。

您如何計算知識管理?計算以前的GPS讀數到當前的距離?或者也許回到起點?請記住,GPS讀數可能有點片面;每隔12秒繪製一輛直線行駛的汽車可能會看起來醉dr dr的。同時,我會假設你需要某種索引(傳感器,序列)來跟蹤以前(或第一個)讀數來完成距離。

但是,您將如何處理距離?它是不斷地讀出來顯示在某個地方嗎?也就是說,你是否每分鐘更新一些非MySQL的東西150次?如果是這樣,你有一個應用程序應該接收新的GPS讀數,將其存儲到MySQL中,讀取起點(或記住它),計算公里並更新圖表。也就是說,MySQL不是這裏的重點,但是你的應用程序是。至於lat/lng的表示,我參考my cheat sheet以查看FLOAT可能是最優的。

公里應該幾乎可以肯定存儲爲FLOAT。這給你大約7位有效數字的精度。您應該決定是否將該值表示爲「米」或「公里」。 (精度相同。)

+0

感謝您的回覆。我用我的數據庫中的20 M記錄做了一些測試,查詢只用了0.0003 seg。我計算新點和之前的KMs。我只需要用於後端操作的千米,而不是在視覺地圖中顯示。有些事情我在跟蹤器停止時遇到了問題。例如,跟蹤器會停止90秒,但是y會收到很大的差異lat/lng,並有很大的誤差(有時我會在跟蹤器不移動時註冊20 - 30 kms)。所以我試圖在速度接近0公里/小時時做一些丟棄位置的代碼。你對此有何看法? –

+0

在徒步旅行時,我坐在餐廳吃午飯時鐘0.5公里。我認爲訣竅是質疑突如其來的跑步,比如從一次閱讀到下一次閱讀100公里/小時 - 一個或兩個位置都是錯誤的和/或其他的。和/或一些平滑算法。我不知道物理學 - 是偶爾讀的「壞」,還是所有的讀數都是「關」的? (根據我的經驗,這主要是後者。 –