close
当前位置: 物联网在线 > IT技术 > 大数据 >

如何让热点图支持大数据

所谓的热点图,是图1)构建一张灰度图,图2)在每个热点的位置上绘制并叠加形成灰色的热点图,图3)根据颜色表生成热点图。不难看出,最核心的是图2的过程。详情参考《可视化之热点图》。

大数据

图1

大数据

图2&图3

1强调两处细节

这种思路效率高,缺点就是不够灵活,每个点都是同一个样式,没有考虑该点的半径和权重。创建大小不一的模版(章),每个热点根据自己的半径值选择对应的章就可以,实现思路如下:

大数据

半径&模版

权重的不同,是通过盖章的“力度”,权重越大,不透明度越大,这样叠加时也越能体现权重大的效果。是否发现,这个方式会产生覆盖情况,并不严谨。

大数据

权重&透明度(力度)

2大数据渲染

我们看看在不同数据量下的性能分析。7759个热点,每个点有经纬度和权重三个float值,生成一张2000*1400左右的热点图。采用pa7/heatmap.js,在Chrome下测试1w(1倍),5w(5倍),10w(15倍),60w(75倍),100w(150倍),600w(750)六个级别,千万级别会崩溃。

备注:只测试了一次,误差估计不小,仅供参考。

大数据

数据转换消耗(毫秒)

大数据

纯渲染时间(毫秒)

在这种方式下渲染时间依次为:68,100,194,894,2918,63817(ms)。数据量在100w以内的还好,渲染时间将近3s。但再往上就不给力了。千万级别下读取会崩溃,内存达到1.2G以上。渲染就算可用,从时间消耗上也不实用。

在渲染性能方面,之前我们通过模版,盖章的思路已经优化了,沿着这个思路提升空间不大。而且,因为渲染上存在叠加依赖,很难并行。

CPU并行

自己实现渲染算法,以并行的方式实现数值计算部分。思路如下:对热点图这个目标图片,遍历每一个像素,以像素半径做一个缓冲区分析,获取对应的热点数据(数据支持范围查询)。如果没有热点,则该像素为空;如果存在N个热点,则计算该点的热点值。乍看上去,这不是又倒退到逐点计算的思路上。

坦白说,我很不喜欢这个思路,就好比老师出了一道1+2+3……+100的题目,本来是想让你发现规律和数据模型,。可是你真的在一个个累加。但全班同学合作,把这100个数分解成10组,每人分别计算一部分,同样也能很快得出结果,这就是另一个角度的智慧。

因为每个点的计算是独立的,可以通过并行来优化“渲染”时间。但这种思路是以放弃渲染技术为代价的,也要借助于空间索引,并行计算,在JS上很难实现。

另外,这个思路让我认为(不知道对不对),点差值和热点图并无本质区别。

GPU并行

下图是OpenGL的思路:每一个热点构造成一个正方形,对角线将其分为两个三角形,有四个顶点和6个顶点索引。采用批次渲染的方式,每个批次下渲染1w个热点(对应4w个顶点),将数据分解为多个批次,实现大数据的渲染,GPU中实现混合效果。具体的shader代码可以参考pyalot。

大数据

我在WebGL下实现了这个思路,还是刚才那个7759个热点的数据,我放到一个渲染批次,对这一个批次渲染多次, 1s内完成千万级别的渲染。

大数据

3问题

you might also like

  • 给Java开发者的10个大数据工具和框架
  • 像研究股票一样研究白酒基于大数据的量化基本面研究探索
  • 用 Python 分析过去四年的比赛数据,实力最强的 NBA 球队原来是它
  • 2017“一带一路”国际舆情大数据报告
  • 做数据分析时,R 用户如何学习 Python?
  • 手把手教你做数据分析
  • 金融大数据行业应用及发展全洞察
  • 对话谷歌首席数据官沙克特——机器学习将如何发展
  • 感悟大数据——从数据管理和分析说起
  • 工作职位推荐系统的算法与架构

  • (责任编辑:ioter)