当前位置:编程学习 > C#/ASP.NET >>

高分寻求解决方案

小弟帮人开发了一套出租车监控定位系统,大概共有2000台出租车,每台出租车都装有GPS定位器,每台车每10秒实时的将定位数据发送到服务器,服务器采用VS2008编写了一个WINDOWS系统服务来接收数据,传输协议为TCP,数据保存在数据库,另外提供一个网站用来监控每台车的位置,网站不断地从数据库中读取最新的数据来更新车辆的最新位置。目前遇到的问题主要是性能问题:数据量大导致网页查询慢。2000台车每天24小时GPS不间断传输数据,GPS每10秒发送一次数据到服务器,每天服务器接收的总的数据量就是2000台X24小时X60分钟X每分钟6次=1728万条记录。这样系统会运行越来越慢。虽然创建了索引,定期清理数据,但随着时间越来越长,性能越来越慢。我想可能这种工作方式不太好,但水平有限,实在想不到有别的方法可以解决这个问题,我的想法是能不能不用数据库,WINDOWS服务接收到定位数据后,保存在内存里或者其它什么地方,然后网页可以用什么方法可以直接读取到数据? --------------------编程问答-------------------- 我的想法是能不能不用数据库,WINDOWS服务接收到定位数据后,保存在内存里或者其它什么地方,然后网页可以用什么方法可以直接读取到数据

这种情况必须不能使用数据库,, 想记录数据再用数据库,   车辆发送信息到window服务保存内存中, 网站可以通过消息队列 获取,获取之后就删除, --------------------编程问答-------------------- 海量数据处理 --------------------编程问答-------------------- 这种就是每一天备份一下数据库 到硬盘里

用job或者其他的方法来定时备份数据库

几天备份一次 或者一天备份一次

查询的时候采用分布式数据库查询

job备份数据库

分布式 --------------------编程问答--------------------
引用楼主 hubeigaofeng 的回复:
另外提供一个网站用来监控每台车的位置,网站不断地从数据库中读取最新的数据来更新车辆的最新位置


这也只需要考虑最新位置信息吧!两千个数据,也不过占用你不足50k内存,下毛毛雨嘛!

你在设计用户最关心的高性能应用时,本来就不应该从数据库表出发来考虑程序架构。 --------------------编程问答-------------------- 我们做个相反的假设,假设服务器程序重启了,即内存中的车辆位置信息全都丢了,有什么关系么?等服务器启动好之后,新数据又来了! --------------------编程问答-------------------- 像你这种数据 我觉得没有保存的必要吧,所以喽,当天用完了就差不多该删掉了。。。


我的意思是,既然是监控,那就即时的好了。。。直接发给你的网站的接口上。。。
2000个太多的话可以分步发送。。。
不如间隔有10秒 每秒200个呗。。。。 --------------------编程问答-------------------- 保存最新的几条位置信息就OK了吧?有什么必要把所有数据都保存吗? --------------------编程问答-------------------- 使用高速缓存,例如每十秒更行一次缓存,没必要数据都是最新的 --------------------编程问答--------------------
引用 4 楼 sp1234 的回复:
引用楼主 hubeigaofeng 的回复:
另外提供一个网站用来监控每台车的位置,网站不断地从数据库中读取最新的数据来更新车辆的最新位置


这也只需要考虑最新位置信息吧!两千个数据,也不过占用你不足50k内存,下毛毛雨嘛!

你在设计用户最关心的高性能应用时,本来就不应该从数据库表出发来考虑程序架构。


实际情况是所有的程序、网站和数据库都安装在同一台服务器,现在主要是数据库太占CPU和内存了。我是在网页上调用GOOGLE地图来显示位置的,地图上要同时显示2000台车的位置,我现在用AJAX每隔10秒从数据库中读一次这2000台车的最后位置,网站访问的客户也很多,而且很多都是打开网页都不关闭的,就在那里让它一直自动刷新,我已经把历史数据和当天数据分成两个表来保存了,网页读的都是当天数据表,但WINDOWS服务也在不停的写这个表,这样就导致CPU和内存占用很高,有没有方法让网页直接从WINDOWS服务里取数据,而不通过数据库? --------------------编程问答-------------------- 你的数据库中应该有两张表吧,1:最新数据,2:历史数据

你可以这样,GPS上传信息到服务器之后(我以前写服务器程序有3个[接收程序,客户端服务程序,数据库程序],我不知道你几个),服务程序做两件事:1把实时数据传回给客户端监控程序,2是把数据传给数据库程序存起来,这样你的客户端程序是跟数据库没有交互的,只有在客户端上想查历史数据的时候才有交互。

每次登陆客户端只需要去最新数据表中提取最新的数据就行了(你不能保证每个GPS都是正常的吧,不要认为这张表没用)。 --------------------编程问答-------------------- RemotingClientProxy + RemotingService =远程过程调用! --------------------编程问答--------------------
引用 10 楼 wozaiqingniao 的回复:
你的数据库中应该有两张表吧,1:最新数据,2:历史数据

你可以这样,GPS上传信息到服务器之后(我以前写服务器程序有3个[接收程序,客户端服务程序,数据库程序],我不知道你几个),服务程序做两件事:1把实时数据传回给客户端监控程序,2是把数据传给数据库程序存起来,这样你的客户端程序是跟数据库没有交互的,只有在客户端上想查历史数据的时候才有交互。

每次登陆客户端只需要去最新数据表中提取……


我和你的想法是一样的,就是不知道怎样将服务器程序接收到的数据可以传给网页,或者网页能够从服务器程序里读取到。 --------------------编程问答--------------------
引用 5 楼 sp1234 的回复:
我们做个相反的假设,假设服务器程序重启了,即内存中的车辆位置信息全都丢了,有什么关系么?等服务器启动好之后,新数据又来了!

因为以后可能会不断的增加车辆和用户,目前从数据库中读取数据的方法已经严重影响速度了,基本上会有5~10秒的延迟。我想网页最好不要从数据库中取数据,最好能直接访问WINDOWS服务中的某个变量,或者两者之间有个数据直接交互的方法。能否给些建议? --------------------编程问答-------------------- 晕!你一点也没有看懂我的意思。

你的这个主要页面的核心需求,就是即时显示车辆位置对吧?!那么好的,你的设计建模就应该是车辆当前的位置。既然是当前位置信息,那么就是后入的信息去覆盖之前的信息。

按照业务来设计,纠缠什么数据库表呢?如果你先入为主地去什么数据库里查询最后一个位置信息,这不是自找苦吃嘛。怪不得你想不出真正解决业务性能需求的设计来呢! --------------------编程问答--------------------
引用楼主 hubeigaofeng 的回复:
小弟帮人开发了一套出租车监控定位系统,大概共有2000台出租车,每台出租车都装有GPS定位器,每台车每10秒实时的将定位数据发送到服务器,服务器采用VS2008编写了一个WINDOWS系统服务来接收数据,传输协议为TCP,数据保存在数据库,另外提供一个网站用来监控每台车的位置,网站不断地从数据库中读取最新的数据来更新车辆的最新位置。目前遇到的问题主要是性能问题:数据量大导致网页查询慢。2000台车……

从减少数据量角度讲,可以为这2000台车设置固定的5个位置信息字段(如果需要跟踪驶向轨迹的话),每次接收到信息只是循环的Update(),这样就可以大幅度减少记录数量。 --------------------编程问答-------------------- 以后每创建一个出租车对象时,在数据库自动添加这五个位置信息字段即可。 --------------------编程问答-------------------- 每天产生一张表。

加上把出租车分类, 比如A类在早上9:30查询, 以此类推,

数据展示用winform 或者wpf --------------------编程问答-------------------- 不懂…… --------------------编程问答--------------------
引用 14 楼 sp1234 的回复:
晕!你一点也没有看懂我的意思。

你的这个主要页面的核心需求,就是即时显示车辆位置对吧?!那么好的,你的设计建模就应该是车辆当前的位置。既然是当前位置信息,那么就是后入的信息去覆盖之前的信息。

按照业务来设计,纠缠什么数据库表呢?如果你先入为主地去什么数据库里查询最后一个位置信息,这不是自找苦吃嘛。怪不得你想不出真正解决业务性能需求的设计来呢!


抱歉好久没来了。主要是用户要求要保留历史数据,最起码最近三个月的数据能查到。因为每台GPS每10秒发一次定位数据,2000台车一天的数据量就是1728万条,三个月下来就有15亿条,我现在已经数据分成历史记录表和实时记录表来保存,实时记录表只记录最后一次的位置,其他的数据全部都放到历史记录表保存,但由于读写太频繁了,表里面的数据量太大,往历史记录表中插入数据时经常会导致超时。还有没有办法优化? --------------------编程问答--------------------
引用 17 楼 lovesongforever 的回复:
每天产生一张表。

加上把出租车分类, 比如A类在早上9:30查询, 以此类推,

数据展示用winform 或者wpf


这个方法我也想过,但如果要跨日期查询,还要动态的去UNION一堆TABLE,可能保存的速度快了,查询的反而慢了。 --------------------编程问答-------------------- 学习下 mark --------------------编程问答-------------------- 第一,要每天记录1728w条记录的服务器必须很强壮。
第二,实时显示的服务器必须和记录服务器分开。

记录是记录,显示是显示,实时监控的服务根本就不需要数据库。连update都不要。数据都在内存里。因为一共就2000条数据。

其实cpu和内存占用巨大的是一天要插入1728w条数据。单独弄一个数据库服务器吧。还要有磁盘阵列。这么大的数据写入,硬盘很容易挂的。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,