作者:蒋步星

来源:数据蒋堂

本文共1400字,建议阅读8分钟。
大数据的技术本质就是高性能,性能优化也是程序员们的永恒话题。

大数据的技术本质就是高性能,性能优化也是程序员们的永恒话题。

这里说的性能优化,主要是指在程序员的努力下能达到某种性能提升效果的过程。只要简单换台机器就能加速的事情,业主方要么早就做过了,要么就是条件不允许这么做。

这时候,优化方案的关键在于算法,具体来讲,就是要设计出低复杂度的计算方案。我们说过多次,软件不可能提高硬件的性能,只有采用了低复杂度的算法,也就是计算规模有了实质性的下降时,才可能在相同硬件环境下获得更优的性能。

不幸的是,这类方案通常都是定制化的,换一个场景可能就没有效果了。换句话说,这些方案是专门为某个计算任务设计的。


以分组运算举例:如果我们事先知道GROUP BY的结果集很小(可以在内存中放下),那么单次遍历不需要生成临时外存数据就可以完成运算,而且也容易采用并行计算。而如果结果集很大、内存无法装下时,则需要生成临时缓存数据用于保持中间结果,而这时候也几乎不可能再用并行机制,因为外存的并发冲突经常会抵销掉并行带来的好处。而如果我们知道用于分组的数据已经针对分组字段有序时,则即使是大结果集也可以不必生成临时缓存数据,这样又可以采取并行计算的手段来提高性能。反过来,如果我们在大结果集时使用了小结果集的算法,那就会导致内存溢出;而在无序情况下使用了有序算法,则会得出错误的计算结果。

也就是说,看起来非常类似的计算任务,在不同场景下会采用很不一样的动作,这需要了解计算和数据特征才能做出选择。

如果要考虑通用的场景,那只能使用最保守的算法。对于分组运算来讲,也就是使用大结果集且数据无序的算法,这样虽然能保证正确计算出结果,但性能就会很差。


这样,性能优化就是个手艺活了!

手艺活需要就事论事地精雕细刻,这又需要我们手里有个好工具,能够让我们快速实现设计出来的计算方案,不能发生想出好算法却无法实现的迥境。

作为当前数据计算主流的传统关系数据库在这方面做得很差。SQL提供的运算太少,而且透明度过高,程序员对计算过程的控制力度很弱,很难实现自己的想法。比如上面说过几种在某些场景下可以提升性能的分组算法,SQL都没有直接在语法层面上提供,只能指望数据库引擎的自动优化,而这又严重依赖于数据库系统以及当前场景的复杂性,这就经常会发生我们明知有好算法却无能为力的现象。

事实上,SQL并不是完全没有提供这种能力。有经验的程序员在发现SQL执行过慢时都会去观察数据库采用的执行计划,然后再去调整SQL语句让数据库采用自己期望的路径去计算。有些数据库也提供了一些关键字来人为改变执行计划,从而达到控制计算过程的目标以期获得更优性能。但无论如何,数据库在这方面提供的功能仍然非常粗糙,远远满足不了程序员进行性能优化的需求。

使用集算器的SPL编程能实现更高性能的原因就在于此。SPL中提供了大量仅适合某个场景的运算方法,程序员就可以根据运算和数据的特征选择合适的方法来组合出低复杂度的算法。这时候,即使单项运算的性能并不比数据库更高(用Java写的集算器在基本运算方面一般不会比用C++写的数据库性能更好),但仍然经常能获得数量级的性能提升,这就是算法的力量。


总结一下,性能优化的关键在于两条:

  • 能根据任务特征设计出更优的算法;

  • 有好的工具能迅速实现这个算法。想不出好算法时,有再好的工具也是白搭;而想出好办法了,没有好工具也只能干瞪眼。

设计算法虽然没有固定的程序,但还是有一些常规套路,比如前面举例说的分组运算的不同情况应当采用的手段。这需要充分了解运算原理,后续我会就这个话题写一系列文章,介绍各种场景下可能采用的低复杂度算法及其原理。初步列了一下提纲,这个系列话题估计能写三五十篇文章出来。

专栏作者简介

润乾软件创始人、首席科学家

清华大学计算机硕士,中国大数据产业生态联盟专家委员,著有《非线性报表模型原理》等,1989年,中国首个国际奥林匹克数学竞赛团体冠军成员,个人金牌;2000年,创立润乾公司;2004年,首次在润乾报表中提出非线性报表模型,完美解决了中国式复杂报表制表难题,目前该模型已经成为报表行业的标准;2014年,经过7年开发,润乾软件发布不依赖关系代数模型的计算引擎——集算器,有效地提高了复杂结构化大数据计算的开发和运算效率;2015年,润乾软件被福布斯中文网站评为“2015福布斯中国非上市潜力企业100强”;2016、2017年,荣获中国电子信息产业发展研究院评选的“中国软件和信息服务业十大领军人物”;2017年度中国数据大工匠、数据领域专业技术讲堂《数据蒋堂》创办者。

数据蒋堂

《数据蒋堂》的作者蒋步星,从事信息系统建设和数据处理长达20多年的时间。他丰富的工程经验与深厚的理论功底相互融合、创新思想与传统观念的相互碰撞,虚拟与现实的相互交织,产生出了一篇篇的沥血之作。此连载的内容涉及从数据呈现、采集到加工计算再到存储以及挖掘等各个方面。大可观数据世界之远景、小可看技术疑难之细节。针对数据领域一些技术难点,站在研发人员的角度从浅入深,进行全方位、360度无死角深度剖析;对于一些业内观点,站在技术人员角度阐述自己的思考和理解。蒋步星还会对大数据的发展,站在业内专家角度给予预测和推断。静下心来认真研读你会发现,《数据蒋堂》的文章,有的会让用户避免重复前人走过的弯路,有的会让攻城狮面对扎心的难题茅塞顿开,有的会为初入行业的读者提供一把开启数据世界的钥匙,有的甚至会让业内专家大跌眼镜,产生思想交锋。

数据蒋堂第二年往期回顾:


数据蒋堂 | SQL是描述性语言?

数据蒋堂 | 存储和计算技术的选择

数据蒋堂 | 人工智能中的“人工”

数据蒋堂 | 中国报表漫谈

数据蒋堂 | 内存数据集产生的隐性成本

数据蒋堂 | 多维分析预汇总的功能盲区

数据蒋堂 | 多维分析预汇总的存储容量

数据蒋堂 | 多维分析预汇总的方案探讨

数据蒋堂 | 数据库的封闭性

数据蒋堂 | 内存数据集产生的隐性成本

数据蒋堂 | 前半有序的大数据排序

数据蒋堂 | “后半”有序的分组

数据蒋堂 | 时序数据从分表到分库

数据蒋堂 | BI系统的前置计算

数据蒋堂 | 性能优化是个手艺活相关推荐

  1. DELETE大批量数据的性能优化

    http://litterbaby.itpub.net/post/16841/276327 DELETE大批量数据的性能优化 问题的提出: 一个表有上千万的数据,欲从该表中删除部分数据: 在线用的生产 ...

  2. mysql 查找相似数据_MySQL性能优化做得好的人,都懂的索引绝技

    一步一步推导出 MySQL索引的底层数据结构. MySQL作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 MySQL数据的存储形式以及索引的设计,决定了 MySQL ...

  3. iMobile中三维数据的性能优化

    作者:xinxin 目前,很多项目都用SuperMap iMobile for Android产品来实现展示三维数据效果,但由于三维数据对硬件设备要求高,而移动端设备的硬件远不如PC端,所以想要在iM ...

  4. 【ELT.ZIP】OpenHarmony啃论文俱乐部——大数据框架性能优化系统

    本文出自ELT.ZIP团队,ELT<=>Elite(精英),.ZIP为压缩格式,ELT.ZIP即压缩精英. 成员: 上海工程技术大学大二在校生 合肥师范学院大二在校生 清华大学大二在校生 ...

  5. 分布式实时分析数据库citus数据插入性能优化

    前言 从可靠性和使用便利性来讲单机RDBMS完胜N多各类数据库,但当数据量到了一定量之后,又不得不寻求分布式,列存储等等解决方案.citus是基于PostgreSQL的分布式实时分析解决方案,由于其只 ...

  6. [转]MySQL innoDB数据插入性能优化

    转载自: http://hiyijian.blog.163.com/blog/static/173086472201121621326471/ 起因:有一个innoDB引擎的表Table,在一个大概3 ...

  7. oracle子查询不减少数据,Oracle性能优化-子查询到特殊问题

    编辑手记:前面我们介绍常用的子查询优化方法,但总有一些情况时在规律之外.谨慎处理方能不掉坑. 前文回顾: 作者简介:韩锋 精通包括Oracle.MySQL.informix等多种关系型数据库,有丰富的 ...

  8. mysql百万数据根据索引查询_mysql创建多列索引查询百万表数据的性能优化经验分享...

    最近发现最代码网站中的收到的评论,提到我的,心情被赞的查询异常缓慢,通过nginx日志发现响应时间快的在5s,慢的有13s,终于忍无可忍花时间来解决了. 执行explain之后的截图如下: 可以看到p ...

  9. Pandas处理大数据的性能优化技巧

    Pandas是Python中最著名的数据分析工具.在处理数据集时,每个人都会使用到它.但是随着数据大小的增加,执行某些操作的某些方法会比其他方法花费更长的时间.所以了解和使用更快的方法非常重要,特别是 ...

最新文章

  1. 深度学习--TensorFlow(5)BP神经网络(混淆矩阵、准确率、精确率、召回率、F值)
  2. poj1410(线段相交问题判断)
  3. Leetcode题库 6.Z字形变换(C实现)
  4. javaweb项目搭建ehcache缓存系统
  5. php 实现mqtt 订阅监听功能出错_IoT物联网实现M2M设备之间联动实战
  6. matlab2c基础使用教程(实矩阵、复矩阵)
  7. 人脸图像数据库(完整版)
  8. 作业四:结对编程项目--四则运算
  9. 微信红包测试思维导图
  10. BIT-Vehicle Dataset - 车辆车型识别数据集
  11. 在HTML页面显示时钟
  12. 华视电子web读取身份证信息
  13. php域名免备案转发,免备案高防CDN支持过墙域名跳转解决域名DNS污染
  14. The Necklace
  15. 大众点评团购退款的小伎俩,折射出全商金融的事实?
  16. 用python画佩奇_使用python画个小猪佩奇的示例代码
  17. 停车场管理系统页面实现(1)登陆页面设计
  18. 应广单片机框架程序_T16应用
  19. tElock 1.0脱壳 风云防火墙个人版
  20. 如何准备毕业论文写作?

热门文章

  1. 【转】开放api接口签名验证
  2. jquery 临时存值
  3. J2EE 13规范(4)-JSP
  4. 《C程序设计的抽象思维》1.9编程练习
  5. ios日历视图实现日期输入
  6. Python实现线程池
  7. Dos判断文件夹有没有存在,如果存在删除,不存在创建
  8. too many levels of symbolic links的错误
  9. [CTO札记]MM晕倒地铁中--最适合的活动未必是阅读
  10. Java引用实际上就是指针,下面关于Java的引用的说法正确的是______。