业务背景:众所周知,淘宝网作为一个开放平台为广大用户开辟了一块开放的空间,而图片作为一种非常有表现力的一种表现形式被广泛应用于淘宝的广大用户中。为了管理庞大的图片数据(20亿图片,有5亿被逻辑删除,15亿可用),我们图片空间(http://tu.taobao.com/)应运而生。在淘宝tfs中保存的图片我们自然会为广大用户提供优质的保障服务,哪怕使用删除功能也只是执行逻辑删除。然而,在这20亿意外还有很多外链图片,这些图片的维护可能就没有我们tfs做得那么细致而优质了。于是,很多用户在使用淘宝业务的时候会时常发现网页上有很多“X”,因为那些被引用的外链图片已经不能被引用了。虽然在图片添加的时候我们已经会主动剔除那些非法连接(即img标签中src不能匹配为“http://xxx.xxx.xxx/xxx.jpg”等链接),但是仍然有很多不可用的外链充斥在各网页中。为了解决这样一个问题,小弟我最近负责的一个任务就是去主动查出不可用图片并告知图片使用者。
业务流程:小二会获取一份用户id列表文件,我手中的那份列表有41万个用户id,通过上传此用户id文件,我们的图片爬虫程序会去找到每个id对应的前十个宝贝,再找到前十个宝贝中的十个外链,逐个检查外链是否可以访问,如果不能访问则向数据库中添加一项纪录,等扫描结束以后,我们会定期根据扫描结果去通知“坏外链”拥有者修改此外链。
故事从这里开始了…..
作为一个在淘宝实习的小二本来对这项任务不是很感冒的我,居然做着做着做出感情来了。由于刚刚进入一家公司工作,而自己的学业还有一年完成,所以工作进度很慢,如此简单的一个任务已经做了两周多了,到发表这篇文章的时候是第三周的周三了。而明天只是发布外链检查功能,所以小弟我甚为惭愧。
这个任务是从一个比较忙的师兄手上接下来的,师兄已经完成了一个版本,但是完成的版本对业务背景理解不是很透彻结果无法应对如此大的数据量(虽然只有41万,但是我们也只有一台服务器在处理这项工作)。其实,我要做的事情很简单“单线程→多线程,防止内存溢出”。于是,我的做法如下(想法很符合我这样的工作经验):
(假定允许线程最大值50个)
把41万数据平均分配若干份,分配到足够多的线程(50个)中进行处理,处理效率50条/单位时间,内存中的数据为50*10*10条+4.1M*2(数据切割的时候在内存中会出现2分用户ID),这里是以用户ID为标志量来分配任务的。
然而,就在我的代码在预发环境上运行了一段时间以后,老大找到了我——代码重构,因为代码实在是不怎么好看,线程都是通过new Thread(){}.start来开出来的,线程的管理比较混乱,有些做法甚至不安全。
老大的做法是:遍历41万用户,给一个阻塞队列,队列大小最大线程数(50)*10也就是500,遍历用户的过程和我的方案没什么区别,写个循环就跑呗,但是标志量不同,老大的方案用的是图片链接,每检测到一个外链就扔进队列进行处理,内存中的数据为500条+4.1M,减少内存占用4500条+4.1M,而他的线程管理是交给jvm做的,用到了线程池来自动分配。但是,这个方案还是有问题的,我和老大两人花了2天才解决那个问题。为了减少数据的冗余,我们需要进行去重,首先,如果链接重复就直接不检查后面送入的重复链接,然后,如果是有个宝贝中出现了“坏外链”,那么这个宝贝的其他链接就不在检测。既然是通过外链这个标志量来进行任务分配的,那么根据宝贝ID进行的去重工作自然可能出问题(不同的线程操作的不同外链来自同一个宝贝就会发生冲突),于是,我们需要在根据宝贝ID去重用的那个set上面加一把锁。
不难看出,虽然我们2个方案的处理效率在理论上是一致的,但是老大的方案减少了内存的使用,并且不用自己去管理线程,当需要紧急终止的时候,老大的方案中也有很多亮点,至于还有一些在编码上的技巧我就不赘述了,因为我还没弄明白,因此,我通过这次的任务还是学到不少东西的。(话说去重的工艺居然还是这次任务才学到的Orz惭愧啊~)可惜,由于涉及到公司的业务,我不能共享代码,希望各位看官多多包涵。
分享到:
相关推荐
标题中的“手机号码归属地数据库41万条2018年8月”指的是一个包含大量手机号码及其对应归属地信息的数据集,总计41万个记录,这些数据来源于2018年8月。这样的数据库在多种场景下都有其应用价值,例如市场营销、客户...
excel版手机号码归属地查询,A列输入手机号,B列加号下拉查询,data表内附41万条号段归属地、运营商信息,注意:仅号段,非号码!
在使用ANUSPLINE41时,需要录入一些程序输入项,包括独立样条变量和协变量的个数,每个独立变量的上下限,每个变量的可选的转换方式以及最低样条次数等。同时,用户还需要指定输入输出文件。位于独立变量界限外的点...
报告指出,五氧化二钒的价格达到了41万,同时MB钴价继续上涨,这表明这两个金属品种的市场表现强劲。 1. **五氧化二钒**:作为重要的化工原料,五氧化二钒在钢铁冶炼和催化剂制造中有广泛应用。报告中提到的价格...
石油开采行业月报:EIA下调全球日供应41万桶,三季度库存或下降?-0528-信达证券-13页.pdf
### ANUSPLIN41用户指南:薄盘光滑样条插值详解 #### 薄盘光滑样条插值技术概览 ANUSPLIN4.1是一款专注于多变量数据分析和插值的强大工具,尤其在处理空间数据时表现卓越。其核心功能在于利用薄盘光滑样条插值算法...
石油开采行业月报:EIA下调全球日供应41万桶,三季度库存或下降?-20190528-信达证券-13页.pdf
这些“41个可视化科技感 大数据Excel表格模板”为用户提供了一套高效的数据呈现工具,旨在帮助非专业数据分析师也能轻松理解和展示复杂的数据。Excel作为一款强大的电子表格软件,其内置的图表和数据分析功能已经...
标题中的“行业数据-2020年2月中国主流APP中41岁及以上用户占比”揭示了这个压缩包文件包含的是关于2020年2月期间,中国市场上主要应用程式(APP)中41岁以上用户比例的相关数据。这份数据报告可能是由专业的市场...
qq373432361的资源,我重新整理了区号和邮编,格式如下: 号段,省份,城市,运营商,区号,邮编 1361914,陕西,商洛,中国移动,0914,726000 1361915,陕西,安康,中国移动,0915,725000
【标题】:“软件项目模板-U41 用户使用报告”是一个重要的文档,通常在软件开发过程中,项目团队会根据此模板来编写用户使用报告,以便详细记录软件的实际使用情况,为后续的优化和改进提供依据。这份文档可能包含...
在用户规模方面,报告指出皮皮虾在2020年1月的月活跃用户数(MAU)为6895万,日活跃用户数(DAU)为805万,平均每位用户每日使用次数为12次。这个数据由于未更新,沿用了1月份的数据。 关于用户活跃时间分布,皮皮虾在...
- `SC4241_Ver11.exe` 这个可能是EPSON C41清零软件的主程序文件,用户需要运行这个文件来启动清零过程。 在实际使用清零软件前,确保打印机已正确连接到电脑,并且安装了相应的EPSON打印机驱动。然后按照`清零教程...
"Frontier41操作快速入门视频.wmv"可能是一个教学视频,向用户展示如何安装和使用Frontier41软件,包括导入数据、选择DEA模型、分析结果和解读报告等步骤。这对于初学者快速上手操作是非常有帮助的。 "FRONT41-xp1....
截止2021年3月下旬,中国证券基金投资者人数超过1.8亿,除银行及证券公司渠道外的基金线上选购平台,月活用户峰值超5000万,互联网基金用户已经成为重要的线上金融投资消费群体。 报告还显示,Y世代是基金投资主力...
此次更新的IBM X41 BIOS主要涉及两个关键改进:更新CPU LOGO和解决键盘及CPU报错问题。 首先,更新CPU LOGO意味着BIOS中的图像识别部分进行了升级,这通常是由于制造商更换或更新了其品牌标识,或者是为了提供更好...
描述中的“Epson Stylus C41 series 驱动下载”意味着这个驱动程序适用于整个C41系列的打印机,包括C41SX型号。通常,驱动程序的更新对于解决兼容性问题、提高打印质量和效率、增加新功能等都至关重要。用户需要根据...
2020年2月中国主流APP中41岁及以上用户占比.xls
【EIKI爱其LC-XB41 投影仪用户手册】 EIKI爱其LC-XB41是一款设计紧凑、便携性强的多媒体投影仪。它的主要特点包括: 1. **紧凑设计**:这款投影机体积小巧,重量轻,方便携带,可在任何您希望使用的场所工作。 2....
"Front41"是一个专门用于前沿生产函数估计的软件工具,尤其在经济学和管理科学领域中,它被广泛应用于分析和估计生产效率。前沿生产函数是衡量组织或企业如何将输入资源有效地转化为产出的一种数学模型,它对于理解...