网易首页 > 网易号 > 正文 申请入驻

MapReduce思路生成PDF大文件解决方案

0
分享至

最近一段时间公司搞个项目,其中有个将数据按照一定的格式生成PDF文件的功能。在网上搜寻以后决定采用itextpdf插件来实现生成PDF的功能。最初的生成思路比较老套,简单四句话,将要输出的格式做成html,在程序中读取html文件,从数据库获取数据替换html文件中的替换符,用itextpdf将html转换成pdf后保存到硬盘在数据库保存PDF路径。

功能完成后经过QA同事的测试上线了。但是上线后发现总有那么几个用户的文件生成不了,总是报内存溢出错我。经过线上排查发现,这几个用户的数据量都在万条以上,有个用户甚至超过了10万条,这个规模的数据一次从数据库取出来,然后生成PDF,不内存溢出才怪呢。

针对这个问题,又开始了网上搜寻。网上有的说专门找台机器,给这个机器足够大的内存,起一个JVM来生成PDF。这种方式从硬件角度来解决,但是这样会增加硬件成本,而且针对这个问题找OPS估计他们也不会过,没办法只能从软件角度来解决。

在之前的文章中分享过《海量数据面试题分析》。文章中针对海量超过内存的数据处理提供了几种思路,哈希切分、位图、布隆过滤、哈希表、堆等。乍一看有点懵,不过仔细分析后发现虽然方式不同,但是基本思路一样,就是将大数据切分成小的数据,然后一个一个处理,最后再针对各个小数据的结果进行处理,也就是大数据处理的MapReduce思路。

看到这里,举一反三,那么生成PDF是否也可以这样呢。比如:先生成小的PDF,每个小PDF 500条数据,等生成完后再把生成的小PDF集合成一个大的PDF,这样就可以从开发角度来解决生成PDF内存溢出的问题。

好了,思路已经理清,接下来我们来看具体实现。

Pom.xml中引入itextpdf包

实现字符串生成PDF的方法:

分批取出数据生成单个的PDF,记录生成的PDF路径。

分批取数据的实现思路:以一个表的不重复字段为条件,设置这个字段的最小值,分页从数据库查询记录,查询出来后循环数据的时候看这个字段的记录值是否大于当前值,如果大于则用记录值替换当前值。循环结束后再次查询数据库,直到数据库查询不出数据为止。具体代码如下(代码有些长,不用特别在意实现细节,每个公司的业务都不一样,关注实现思路即可):

合并生成的小PDF为一个大的PDF文件:

合并完成后将大PDF的路径保存到数据库,小的PDF从硬盘删除即可。

这种实现方案解决了生成PDF内存溢出的问题,但是还有两个问题没有解决。

  • 生成文件的时间过长,如果是同步的话那么链接早就断开,会影响其它功能的正常使用。

  • 对硬盘IO带来一定压力。

针对第一个问题可以采用将同步变异步的方式来解决,每个公司的异步实现方案可能所有不同,一般使用消息队列或者线程池。使用线程池的话需要注意线程安全和IO问题。

对硬盘IO带来的压力,目前来看可以忽略。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
电动车被查后,8090年代黄包车、28大杠重现江湖,网友:被迫无奈

电动车被查后,8090年代黄包车、28大杠重现江湖,网友:被迫无奈

三月柳
2024-06-13 11:45:57
魔兽世界:暴雪推送开服版本,正式服时间锁定,国服60级PLUS来了

魔兽世界:暴雪推送开服版本,正式服时间锁定,国服60级PLUS来了

胖哥游戏说
2024-06-15 17:33:03
1-2!永远争第一成笑料,被保级队逆转,北京国安争冠,喊喊而已

1-2!永远争第一成笑料,被保级队逆转,北京国安争冠,喊喊而已

体育世界
2024-06-16 00:21:16
是什么让发展中国家毫无翻身希望?

是什么让发展中国家毫无翻身希望?

智先生
2024-06-15 21:04:01
苏纳克,不愧为英国有史以来最荒诞的首相!

苏纳克,不愧为英国有史以来最荒诞的首相!

林子说事
2024-06-14 23:46:54
基因无法骗人!看《爸去哪儿》7位萌娃,10年后颜值差距一目了然

基因无法骗人!看《爸去哪儿》7位萌娃,10年后颜值差距一目了然

贾文彬的史书
2024-06-15 20:34:59
马云的预测或将成真?全国42%的城镇家庭,可能会面临4个困境

马云的预测或将成真?全国42%的城镇家庭,可能会面临4个困境

涛涛生活搞笑
2024-06-15 18:36:49
欧洲杯幸运儿:2天前还在度假,今夜圣殿破门!13天前丢掉欧冠!

欧洲杯幸运儿:2天前还在度假,今夜圣殿破门!13天前丢掉欧冠!

风过乡
2024-06-15 08:04:52
为何许多产品上标注,不建议使用“南孚电池”?原因出人意料

为何许多产品上标注,不建议使用“南孚电池”?原因出人意料

人情皆文史
2024-06-14 05:10:04
90国将出席乌克兰和平峰会,沙特印度意外参加,俄中缺席

90国将出席乌克兰和平峰会,沙特印度意外参加,俄中缺席

亡海中的彼岸花
2024-06-16 00:10:02
F-16登场,留给侵略者耀武扬威的时间不多喽

F-16登场,留给侵略者耀武扬威的时间不多喽

临墨有余
2024-06-13 09:06:39
独行侠为什么能大胜凯尔特人?赛后苏群一席话,说得很实在

独行侠为什么能大胜凯尔特人?赛后苏群一席话,说得很实在

懂球哥评球
2024-06-15 12:27:24
苹果首次展示卫星短信功能 仅限iPhone 14及以上机型

苹果首次展示卫星短信功能 仅限iPhone 14及以上机型

手机中国
2024-06-14 06:55:20
“欢迎来浙大!”不少高校向17岁天才少女抛出橄榄枝,她上中专是因为偏科?当地村支书回应橙柿

“欢迎来浙大!”不少高校向17岁天才少女抛出橄榄枝,她上中专是因为偏科?当地村支书回应橙柿

都市快报橙柿互动
2024-06-14 20:08:52
夫妻关系:女人年龄过了52岁,大部分女性都会出现的以下状况

夫妻关系:女人年龄过了52岁,大部分女性都会出现的以下状况

今日养生之道
2024-06-14 11:34:50
离婚不离家,女子坦言,想过夫妻生活的时候,还是挺方便!

离婚不离家,女子坦言,想过夫妻生活的时候,还是挺方便!

你回头我就在
2024-06-09 18:11:22
郑州实力太强悍了,全线飙升,最高气温45.4℃,重庆不敢恭维!

郑州实力太强悍了,全线飙升,最高气温45.4℃,重庆不敢恭维!

重庆地产视野
2024-06-15 16:04:43
媒体:曾表示不与共产党人共事的阿根廷总统将访华

媒体:曾表示不与共产党人共事的阿根廷总统将访华

俄罗斯卫星通讯社
2024-06-14 15:05:45
“馒头脸”的风吹进央视:钱花了事业毁了,王珞丹素颜出镜赢麻了

“馒头脸”的风吹进央视:钱花了事业毁了,王珞丹素颜出镜赢麻了

谈娱新语
2024-06-15 22:07:57
老戏骨离世!66岁抗癌失败,演员妻子忙着拍戏,最后一面都没见到

老戏骨离世!66岁抗癌失败,演员妻子忙着拍戏,最后一面都没见到

综艺拼盘汇
2024-06-15 04:27:27
2024-06-16 01:46:44
非常美丽的句子12138
非常美丽的句子12138
每天分享有趣的视频
6063文章数 10253关注度
往期回顾 全部

科技要闻

TikTok开始找退路了?

头条要闻

563支AI队伍和姜萍考同一份试卷:最高34分 都没进决赛

头条要闻

563支AI队伍和姜萍考同一份试卷:最高34分 都没进决赛

体育要闻

莱夫利,让困难为我让路

娱乐要闻

江宏杰秀儿女刺青,不怕刺激福原爱?

财经要闻

新情况!高层对人民币的态度180°转弯

汽车要闻

东风奕派eπ008售21.66万元 冰箱彩电都配齐

态度原创

家居
旅游
亲子
健康
公开课

家居要闻

空谷来音 朴素留白的侘寂之美

旅游要闻

如何文艺消夏?乌镇10大活动开启古镇消夏节

亲子要闻

儿童“婚礼”寓教于乐,不必过度解读

晚餐不吃or吃七分饱,哪种更减肥?

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版