一种基于二分法的变步长批量处理算法
1、前言
变步长批量处理算法,在实现某些功能时,非常需要。如数据传输和数据导入时,使用可变步长的批量处理算法,可以极大地提高系统的性能,。
1.1、数据传输
在不稳定的网络环境下,传输失败的几率提高,大的数据块可能会传输失败,如果分为小的数据块,可以传输成功,但由于传输开销,传输效率低。因此希望在网络好的时候,传输大的数据块或高分辨率的图像;网络差的时候,传输小的数据块或对图像进行降质处理,调低图像分辨率,提高压缩比等。因此,可变概念,可以提升服务功能的质量,提升系统的可用性。
1.2、数据导入
数据导入,特别是ETL,大量数据导入,效率非常重要。对于大多数数据库,如Myql,批量新增(如100条记录)和单记录新增的时间消耗相差无几,但处理能力有百倍之差。
曾经,笔者使用逐条数据insert,300万条记录导入,化了半个小时,简直无法忍受,于是,后来改为使用100条批量insert,但由于数据中存在这种那种的异常数据,经常出现一条异常数据导致成批(100条)的数据导入失败,这样,一次导入数据中可能有几条坏数据,导致几百上千条数据没有入库成功,于是,再修改代码,针对这些没入库成功的几百上千条记录里,逐条导入,检测出具体的坏数据。整个过程不堪回首。
因此,数据导入需要可变步长算法,这样可用极大提升数据导入的处理能力。
另外,还有一种Excel数据导入,如规定按记录的编码(字符串类型,如身份证号、手机号、订单编号等,唯一键字段)作为记录的特征字段,但表格数据中有新增的,还有修改的,即如果为新的编码值,为新增记录,如果数据库中编码值已存在,则需要修改记录。这种导入,如果采用固定批量值导入,新增的失败率是很高的,如果批量一旦失败就改为逐条导入的策略,也是效率不高,可变步长算法可非常高效地解决此问题。
1.3、其它应用场景
对这种可变的需求,具体很大的通用性,如与搜索相关的,也可以用可变步长算法来提升处理性能。
2、算法原理
2.1、算法概述
可变步长算法,不是个新鲜的概念,区别在于变化的依据和策略,如最大似然估计、梯度下降等,以及算法复杂度和是否简单易用。
本算法可以归于简单的决策树,有贪婪算法的因子,计算量很少。接口调用可以内嵌方法(类似C++的指针函数)来执行批量处理工作和单条数据修正处理工作。二分法是非常经典的算法,本算法的核心还是二分法,也可以说依据下列公式而开发:
[1 + 2 + 4 + … + 2^n = 2^{n+1}-1
]