2016-10-12 54 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公里/小时 - 一个或两个位置都是错误的和/或其他的。和/或一些平滑算法。我不知道物理学 - 是偶尔读的“坏”,还是所有的读数都是“关”的? (根据我的经验,这主要是后者。 –