记录一次优化程序的过程:几百万的商品过滤黑名单你会怎么想?-阿里云开发者社区

开发者社区> 科技小先锋> 正文

记录一次优化程序的过程:几百万的商品过滤黑名单你会怎么想?

简介:
+关注继续查看

问题描述:

最近遇到一个问题,在程序中,有一个百万级别的商品集合,需要过滤掉商品黑名


单,这个黑名单由运营同学手工配置,从原来的几个到几百个,再到上千个,导致现


在程序在过滤这块耗时太长。如何使得程序的过滤运行时间缩短呢?


分析:


比如,我们的商品集合是Map<ID,Product> skuMap,ID为商品的ID,Product是商品类型


对象,大小是100W+,商品黑名单列表是每隔10MIN去读取一次形成long[] skus,数组的


元素放置的就是商品ID,数组大小是几千级别。



过滤方案:


方案一:


伪码:


for(Product p : skuMap){


  for(Long id : skus){


    if(p.getId() == id){

      //此商品被过滤掉

      p.setFlag(false);

     }

   }

}


这种方案,是最初的写法,想法比较简单,就是2层FOR循环。


但是,随着配置的黑名单越来越多,从最初的几个到几百个,最后到几千个级别,导致


这段代码运行时间发生波动,并且越来越长!



方案二:


如何缩短时间呢?


对于方案一,而言,100W+的商品中的每一个商品都必须对skus进行全部遍历才能完成过


滤逻辑,导致循环次数是 100W+ * 1000+ 级别,也就是10亿+的级别,循环的次数实在


是太多了!要缩短循环次数,才能缩短时间!


伪码:


Arrays.sort(skus);


for(Product p : skuMap){


   int result = Arrays.binarySearch(skus,id);


   if(result < 0){

      p.setFlag(false);

   }

}


如果我们在拿到skus后,对skus内部的ID进行一次排序,然后每个商品对skus进行二分


查找。要知道1000+的黑名单,对于二分查找而言,最多查找11次就可以找到!也就是在


最坏的情况下,我们需要循环的次数变成了100W+ * 11,即1000W+的循环次数!


这样方案二,一下子将10亿+的循环次数缩短至1000W+。


虽然如此,但是程序的过滤时间,日志打印,竟然是300S+,这也无法接受!



方案三:


我们为什么要拿skuMap取遍历skus,为什么不用黑名单去过滤商品集合呢?


伪码:


for(long sku : skus){


  if(skuMap.containsKey(sku)){

     skuMap.get(sku).setFlag(false);

  }


}


外层循环,变成了黑名单,在内部要知道我们用的是HASHMAP查找,实际上,一下子,循环次数变成了1000+。程序的过滤时间也缩短至几秒钟!


本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1707609,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
多模态视频商品检索记录再刷新!第二届淘宝直播算法大赛完美落幕
多模态视频商品检索记录再刷新!第二届淘宝直播算法大赛完美落幕
39 0
移动端手机网站的怎样优化?方法攻略篇
移动端手机网站的怎样优化?随着移动手机用户的持续增加,移动端手机网站优化将成为SEO人共同面对的一个话题,目前已有不少行业的用户群体逐渐对移动搜索产生了依赖性,要想获得成功,就得提前布局移动端网站优化。那下面,根据大伟在爱搜客多年的手机建站经验;接下来为大家分析移动端手机网站优化方法:
1946 0
Linux 学习记录 二 (文件的打包压缩).
前言:本文参考《鸟哥的Linux 私房菜》,如有说的不对的地方,还请指正!谢谢!  环境:Centos 6.4    和window不同,在Linux压缩文件需要注意的是,压缩后的文件会把源文件给替代,无论是gzip、bzip2、xz 均不支持压缩目录,要达到压缩目录的目的,需要用到tar指令。
597 0
API一键搭建智能时光相册,记录你的美
API时代,要搭建一个云相册,就相对来说简单很多,或者说一个开发人员就可以快速实现,并且还能具备智能分析识别、归类、搜索等功能齐全的智能云相册。
3511 0
C++ 应用程序性能优化
C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方程,以及非线性优化的一些算法,如BFGS,FRPR,PSO等等用于多元函数的极值求解,所以这些数值算法的性能直接影响系统的性能。
1156 0
运维调试记录:Opendaylight铍版本开发环境搭建流程
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaobryant/article/details/73609021 一、系统环境 Ubuntu 14.
1408 0
6967
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载