性能优化-记录工作中遇到的点滴
性能优化,常见的框架优化更多的是计算和存储上的优化;计算的优化主要体现在服务器性能和对数据结构的操作上,存储更多是对针对数据结构在读或写上进行优化;比较常见的hadoop大数据处理平台与生态圈,更多的阐述的就是计算与存储:计算上MapReduce--->Spark, 存储上HDFS ---> Hbase
一、软优化:
1. 代码层面的优化,例如:
1)python中访问列表时,set比list快,尤其是数据量比较大时,in的访问,set效率更高
2)内存访问比磁盘访问更快,即适当添加os cache(内存缓存)和mechine缓存(如redis等)
2. 存储时语句上的优化,
1)查询语句优化,例如sql语句(mysql),query查询(es)等
2)索引的优化,mysql中索引设定,es中是否分词索引的优化
3. 针对各种数据存储的服务器,根据存储原理进行优化
其实查询语句的优化,大部分与服务器之间的通信、数据存储的数据结构有关,因此想更深入的进行 软优化,就需要在数据库的底层存储上进行探究
1) 数据在物理服务器上的通信
具有代表性的如:mysql存储数据的过程等、hdfs读写过程
(hbase、hive存储过程也可以看看)
2) 数据落盘、刷盘的频率,数据os cache,日志flush频率等
关于flush过程,可以参考es数据flush存储过程
https://www.jianshu.com/p/15837be98ffd
https://www.cnblogs.com/candlia/p/11919882.html
3) 存储的数据结构
mongo的sharding与replica创建
hbase分region存储等
4)略(嗯,想到再补充,总之存储与优化不能仅限于调用接口式的应用,针对存储的性能优化要落脚于数据库实际的物理存储结构和通信过程)
4. 计算优化
1)单机上使用多进程(计算密集型)、多线程(IO密集型)
2)分布式集群,例如spark框架
二、硬优化
1. 单机性能提升,但纵向提升服务器性能成本较高
2. 集群模式、分布式模式
1)redis sharding式伪分布,使用一致性hash进行负载均衡
2) 多台物理服务器组合,
如:mysql高并发集群、mongo集群、redis集群、es集群、基于hdfs的hbase分布式存储
3. 读写分离,常见的是多种数据库混合,常见是利用缓存数据库提升访问速度
1)常见mysql与redis, es与redis, 但需要注意并发情况下的问题(redis需采用只首次写入,后续不在修改等手段)
2)分表分库进行读写分离,数据根据时间、频率、大小进行拆分
4. 数据库架构体系的搭建(根据难度系数、业务数据量等综合搭建)
########################################################################################
框架搭建---代码层面(针对各种面向对象或函数式编程语言都适用)
1. 常用的模块
配置模块(系统变量和常量)
日志模块(日志格式、日志处理器handler[控制台、日志文件]、kafka等消息系统[需要重写日志handler])
数据库操作封装(mysql、mongo、redis、elasticsearch)
时间处理模块
正则表达式、xpath处理、css处理
常用设计模式(工厂模式、单实例、Lazy、修饰器)
2. 业务处理
1) 爬虫框架,根据业务流程大致模块如下,具体细节具体处理:
数据存储(调用封装的数据库处理业务数据)
数据抽取
下载模块
调度模块
2) 知识图谱,根据业务流程大致模块如下:
知识抽取
同源知识合并 (形成各种源的实体)
异源知识消岐与融合 (根据相同规则[如title,name等]查找出类似实体,然后根据数据源优先规则或其他规则,对不同源数据进行消岐与融合,同时记录不同源之间的联系)
知识推断(常见手段是根据搜索引擎的分词功能进行相似词的检索,利用分类算法对结果进行预测或归类)
3)前后端业务,一般根据业务功能分模块
登录模块(账号与秘钥、session与cookie等)
其他根据具体业务场景等