大数据处理思路---大神们求给思路

大湿级 2014-03-18 10:24:58
这是一道面试的时候技术主管问我的问题,他说是目前团队遇到的瓶颈,而且我也接到他们公司的office了,准备去他们公司上班,所以想跟各位大大谈一下这个问题的思路,到新公司可以有些准备。
问题如下:
WPF框架用Socket通讯,每次读取到PLC DB块的5M数据,而且每次读的间隔为1S左右。
现在出现的问题是,这次读的还没有解析完,下次就读过来了。问有好的方法可以准确,实时的读到DB块更新的数据?。


1.我自己考虑的一个方法是 拆分DB块,设置线程对每个DB块相对固定的地址区域读写,可避免重复读到大量无用数据(因为大部分时间数据都不会变化,只有小部分的值随机变化的)。(这种思路在面试的时候说过,但是面试主管说这种方法有测试过但是没有通过)。
2.今天过来问了一个做PLC的同事,他有给建议是,该通讯方法或该硬件提高通讯效率或通过中间程序处理数据在发送有效数据给我方(可在PLC与我方中间使用通讯协议完成大数据解析,我方值需取有效数据即可)。(我感觉这个没法行得通呀,改硬件的方法基本不要考虑,该通讯方法我之前也有跟主管说用OPC Server来做,但OPC对做5M级别的数据压力也很大呀!)
3.或者有什么好的对大数据块的处理方案?求大神指点。
...全文
445 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jy251 2014-03-19
  • 打赏
  • 举报
回复
不懂PLC,纯属帮顶 看了你的问题, 我总有个感觉,试试流水线会如何? 5MB的数据,我说少一点, 分5个工作线程,第一个线程处理5MB中的第一个1MB数据,第二个线程等待第一个线程处理完毕之后,处理第一个5MB的第二个1MB数据,依次类推 如果你接收的数据来的很快,你只需要保证你分的工作线程很多,并且每个工作线程都处理相对较少的数据,以便能赶上第二批数据的接收处理速度,最理想的状态就是你的第一批5MB的第一个线程刚处理完毕,第二批的5MB数据就进来第一个线程处理了, 然后第二个线程就可以去处理第一批5MB数据的第二块了·· 我越写越啰嗦···也不知道你看懂了我的意思了没 如果做的好的话,那么可以保证你的每个数据进来的第一时间都有线程在处理,等你的最后一个线程处理完毕第一批数据的时候,你的第一批5MB数据就已经处理完毕了
大湿级 2014-03-19
  • 打赏
  • 举报
回复
引用 20 楼 sbwwkmyd 的回复:
引用 19 楼 xyd573417994 的回复:
目前的环境好像是 一个PLC接很多生产线上的设备,然后PLC有生产线上的所有数据,而我们的系统连上PLC,读他的DB块,需要实时监控设备状态在加以控制。 现在卡在得到DB块数据之后的解析上。用多线程拆分数据,这样会提高速度?
如果解析数据是CPU计算型的(一般的解析都是),那么是否使用多线程拆分数据的关键在于你是否有空闲的CPU,一般来说你有几个核心就可以拆成几个线程处理(是并行处理,不是流水线)。
受教了,谢谢! 我会测试这种方法的
showjim 2014-03-19
  • 打赏
  • 举报
回复
引用 19 楼 xyd573417994 的回复:
目前的环境好像是 一个PLC接很多生产线上的设备,然后PLC有生产线上的所有数据,而我们的系统连上PLC,读他的DB块,需要实时监控设备状态在加以控制。 现在卡在得到DB块数据之后的解析上。用多线程拆分数据,这样会提高速度?
如果解析数据是CPU计算型的(一般的解析都是),那么是否使用多线程拆分数据的关键在于你是否有空闲的CPU,一般来说你有几个核心就可以拆成几个线程处理(是并行处理,不是流水线)。
大湿级 2014-03-19
  • 打赏
  • 举报
回复
引用 14 楼 sbwwkmyd 的回复:
如果楼主的数据是一次性发送的,1s能不能传输5M数据仅仅与硬件环境有关,现在最普通的网卡都是12.5MB/s的,与程序基本没有关系。 楼主的CPU如果跟不上业务,就算把数据缓冲起来,内存数据只会越来越多,而且不实时,直到奔溃。除非楼主的服务器有大量的空闲期,能够在空闲期消耗掉这些数据。 另外如果CPU资源本来就紧张,不应该启用压缩,压缩只会让CPU更紧张。
目前的环境好像是 一个PLC接很多生产线上的设备,然后PLC有生产线上的所有数据,而我们的系统连上PLC,读他的DB块,需要实时监控设备状态在加以控制。 现在卡在得到DB块数据之后的解析上。用多线程拆分数据,这样会提高速度?
大湿级 2014-03-19
  • 打赏
  • 举报
回复
引用 13 楼 wyd1520 的回复:
[quote=引用 12 楼 xyd573417994 的回复:] [quote=引用 11 楼 wyd1520 的回复:] 5M数据,而且每次读的间隔为1S左右。 关键是你能在1S把5M的数据转输完么?这才是问题 。现在的网络好像做不到。。。
这个。。不知道能不能做到,大神 我想问问这5M的数据如何解析效率高些。。。[/quote] 1.如果真的是每次都从PLC发5M数据过来,那建个发送缓冲区队列。 好比水库口出水量很大但河流(Socket发送的或接收的最大数)很小。那怎么办呢。 那就在水库出口再建个蓄水区(这个可能有N大)把水库出来的水先放到这个蓄水区里,然后按量发河流。 同样在接收流水的另一端,也要做这个蓄水区 然后再把蓄好的水进行业务处理。。。 当然你为了加快传输速度,那就把转输的数据进行压缩后,再发过去,然后对方接收到后,对数据进行解压。。不过这法子可能会在压缩上耗时间,所以你自己要视情况选择。。[/quote] 压缩解压这中间消耗的时间可能无法接受,我想这种方法能够测试的。谢谢!
showjim 2014-03-19
  • 打赏
  • 举报
回复
如果解析操作是CPU计算型的,并行度取决于CPU核心数。 这种情况,不应该使用流水线,直接使用多线程一个线程处理一个数据就可以了。 你可以看到每一个数据处理的起始时间与结束时间并不会因为流水线而变得更好,流水线仅仅是让程序更复杂了,而且增加了线程同步代价。 流水线适应于IO与CPU交错的情况,比如楼主问题中的 网络与解析,这两个阶段就可以使用流水线技术。
by_封爱 版主 2014-03-18
  • 打赏
  • 举报
回复
并行编程,高效的socket框架,,这样 高并发的东西 大数据就不怕了.
showjim 2014-03-18
  • 打赏
  • 举报
回复
不懂PLC DB块,不过5MB/s从数字上看并不大
大湿级 2014-03-18
  • 打赏
  • 举报
回复
异步读,缓存! 目前就是用的异步读,但是缓存有没有做好我就不清楚了。
风一样的大叔 2014-03-18
  • 打赏
  • 举报
回复
支持楼上的观点
Regan-lin 2014-03-18
  • 打赏
  • 举报
回复
异步读,缓存!
大湿级 2014-03-18
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
(1)提高解析程序本身的效能,对于现在的处理器(10GIPS性能级别),应该可以来得及处理10M数量级的数据(解析一个字节的数据使用1000条指令以下) (2)优化存储,包括异步读写、缓存、优化数据结构等等。工业实时数据库的设计是很高的知识产权。往往人家按照点数授权,1000点的报价都在几千美金以上,你应该和你的公司谈一个合理的价格,如果你就拿点工资就帮它搞定了,你亏大了。
我目前想到的方法是通过中间件来得到我需要的数据,而完成这个问题能得到多少收益我不太在意,主要是我现在对这个问题的了解也比较有限,之前在工作中没做过大数据的处理,就想问一下大神们的经验,然后我能学到跟多的解决方案。 但照版主第一条所说现在的处理器可以处理到10M的数据量,但也有可以尽量优化这个问题的方法吧,我们能继续探讨? 谢谢
threenewbee 2014-03-18
  • 打赏
  • 举报
回复
(1)提高解析程序本身的效能,对于现在的处理器(10GIPS性能级别),应该可以来得及处理10M数量级的数据(解析一个字节的数据使用1000条指令以下) (2)优化存储,包括异步读写、缓存、优化数据结构等等。工业实时数据库的设计是很高的知识产权。往往人家按照点数授权,1000点的报价都在几千美金以上,你应该和你的公司谈一个合理的价格,如果你就拿点工资就帮它搞定了,你亏大了。
rtdb 2014-03-18
  • 打赏
  • 举报
回复
现在的服务器,标配8CPU,不可能不够用的, 当然前提是多线程并发处理。
showjim 2014-03-18
  • 打赏
  • 举报
回复
如果楼主的数据是一次性发送的,1s能不能传输5M数据仅仅与硬件环境有关,现在最普通的网卡都是12.5MB/s的,与程序基本没有关系。 楼主的CPU如果跟不上业务,就算把数据缓冲起来,内存数据只会越来越多,而且不实时,直到奔溃。除非楼主的服务器有大量的空闲期,能够在空闲期消耗掉这些数据。 另外如果CPU资源本来就紧张,不应该启用压缩,压缩只会让CPU更紧张。
本拉灯 2014-03-18
  • 打赏
  • 举报
回复
引用 12 楼 xyd573417994 的回复:
[quote=引用 11 楼 wyd1520 的回复:] 5M数据,而且每次读的间隔为1S左右。 关键是你能在1S把5M的数据转输完么?这才是问题 。现在的网络好像做不到。。。
这个。。不知道能不能做到,大神 我想问问这5M的数据如何解析效率高些。。。[/quote] 1.如果真的是每次都从PLC发5M数据过来,那建个发送缓冲区队列。 好比水库口出水量很大但河流(Socket发送的或接收的最大数)很小。那怎么办呢。 那就在水库出口再建个蓄水区(这个可能有N大)把水库出来的水先放到这个蓄水区里,然后按量发河流。 同样在接收流水的另一端,也要做这个蓄水区 然后再把蓄好的水进行业务处理。。。 当然你为了加快传输速度,那就把转输的数据进行压缩后,再发过去,然后对方接收到后,对数据进行解压。。不过这法子可能会在压缩上耗时间,所以你自己要视情况选择。。
大湿级 2014-03-18
  • 打赏
  • 举报
回复
引用 11 楼 wyd1520 的回复:
5M数据,而且每次读的间隔为1S左右。 关键是你能在1S把5M的数据转输完么?这才是问题 。现在的网络好像做不到。。。
这个。。不知道能不能做到,大神 我想问问这5M的数据如何解析效率高些。。。
本拉灯 2014-03-18
  • 打赏
  • 举报
回复
5M数据,而且每次读的间隔为1S左右。 关键是你能在1S把5M的数据转输完么?这才是问题 。现在的网络好像做不到。。。
showjim 2014-03-18
  • 打赏
  • 举报
回复
引用 楼主 xyd573417994 的回复:
2.今天过来问了一个做PLC的同事,他有给建议是,该通讯方法或该硬件提高通讯效率或通过中间程序处理数据在发送有效数据给我方(可在PLC与我方中间使用通讯协议完成大数据解析,我方值需取有效数据即可)。(我感觉这个没法行得通呀,改硬件的方法基本不要考虑,该通讯方法我之前也有跟主管说用OPC Server来做,但OPC对做5M级别的数据压力也很大呀!)
既然中间层可以无压力解析数据,为什么你的服务器做不到,我觉得反而多了一次数据转发。除非你的中间层是个群集。
showjim 2014-03-18
  • 打赏
  • 举报
回复
引用 8 楼 xyd573417994 的回复:
5M的数据(Bety[])有优化解析方案?
不懂PLC DB块,所以不知道是个什么样的解析规则。 就我接触过的协议数据解析一般都是O(n)的,如果有大量new操作应该使用对象池。
加载更多回复(1)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧