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

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.

相关推荐
热点推荐
曝朱婷伤病复发再收坏消息!伤因曝光2细节揪心,罪魁祸首已找到

曝朱婷伤病复发再收坏消息!伤因曝光2细节揪心,罪魁祸首已找到

综艺拼盘汇
2024-06-15 23:50:07
凯特站C位,卡米拉被边缘化,表情严肃,王室是懂流量的

凯特站C位,卡米拉被边缘化,表情严肃,王室是懂流量的

亦纯杂谈
2024-06-15 23:17:04
选战升温,法国左派宣布结盟,美媒:对马克龙而言无疑是灾难

选战升温,法国左派宣布结盟,美媒:对马克龙而言无疑是灾难

环球网资讯
2024-06-15 06:26:55
陈小春父亲节晒全家福,41岁应采儿提前庆生,Jasper高冷弟弟好萌

陈小春父亲节晒全家福,41岁应采儿提前庆生,Jasper高冷弟弟好萌

娱絮
2024-06-16 03:02:09
好大的胆子!海警新规生效第一天,菲海警船再闯仙宾礁和黄岩岛!

好大的胆子!海警新规生效第一天,菲海警船再闯仙宾礁和黄岩岛!

可乐爱音乐
2024-06-15 23:53:24
北京天津开始出现了,新型婚姻模式,绝对颠覆你的三观。

北京天津开始出现了,新型婚姻模式,绝对颠覆你的三观。

娱乐洞察点点
2024-06-15 14:21:29
当过4年县长、5年县委书记,戴邦和被查

当过4年县长、5年县委书记,戴邦和被查

新京报政事儿
2024-06-15 09:38:59
东方网:有网友发现,欧洲杯场边中文广告牌有定制虚拟广告

东方网:有网友发现,欧洲杯场边中文广告牌有定制虚拟广告

直播吧
2024-06-15 16:01:55
太快了!国产车又出事了!网友拍到新能源车起火瞬间

太快了!国产车又出事了!网友拍到新能源车起火瞬间

看看娱乐与体育
2024-06-14 02:45:17
当叶童同框赵雅芝,终于见识了自然老与“医美老”的差距有多大了

当叶童同框赵雅芝,终于见识了自然老与“医美老”的差距有多大了

时髦范
2024-06-13 09:08:52
游客瓦屋山被砸身亡后续:女孩身份曝光,父母已知情,崩溃难接受

游客瓦屋山被砸身亡后续:女孩身份曝光,父母已知情,崩溃难接受

小甜的快乐生活
2024-06-14 21:01:05
对战韩国伊万弃用韦世豪,真实原因曝光,球迷给伊万点赞

对战韩国伊万弃用韦世豪,真实原因曝光,球迷给伊万点赞

体坛狗哥
2024-06-15 10:38:47
完蛋了,国民党再无重新执政的机会

完蛋了,国民党再无重新执政的机会

雪中风车
2024-06-13 05:04:09
还顾得上破船?解放军舰队突然现身棉兰老岛,马科斯担忧成真

还顾得上破船?解放军舰队突然现身棉兰老岛,马科斯担忧成真

小阿文热点军
2024-06-15 19:05:04
专家分析得出:一旦核战爆发,中国3个地方可躲灾难,一定要知道

专家分析得出:一旦核战爆发,中国3个地方可躲灾难,一定要知道

文史达观
2024-06-14 21:35:17
持续两月货币供应量下滑,可将目前的宏观经济定义为通缩吗?

持续两月货币供应量下滑,可将目前的宏观经济定义为通缩吗?

火星宏观
2024-06-15 06:39:13
朱瞻基:明朝的第五位皇帝,600年来,他身上的2大疑团至今未解

朱瞻基:明朝的第五位皇帝,600年来,他身上的2大疑团至今未解

否知
2024-06-13 09:38:40
上海女子请人上门灭白蚁崩溃:几百元就能解决,对方竟收了9000元!网友:按只收费?

上海女子请人上门灭白蚁崩溃:几百元就能解决,对方竟收了9000元!网友:按只收费?

上海圈
2024-06-15 12:38:41
排协官宣,郎平正式上任,亮相新岗位,赖亚文欣喜,朱婷祝福

排协官宣,郎平正式上任,亮相新岗位,赖亚文欣喜,朱婷祝福

东球弟
2024-06-15 10:13:07
姑娘你不能挡一下那里么?那东西让人看了很难为情,好尴尬!

姑娘你不能挡一下那里么?那东西让人看了很难为情,好尴尬!

水泥土的搞笑
2024-06-15 10:41:27
2024-06-16 07:24:49
非常美丽的句子12138
非常美丽的句子12138
每天分享有趣的视频
6063文章数 10253关注度
往期回顾 全部

科技要闻

TikTok开始找退路了?

头条要闻

欧洲杯-23秒丢球破纪录 意大利2-1逆转阿尔巴尼亚

头条要闻

欧洲杯-23秒丢球破纪录 意大利2-1逆转阿尔巴尼亚

体育要闻

莱夫利,让困难为我让路

娱乐要闻

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

财经要闻

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

汽车要闻

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

态度原创

艺术
本地
房产
数码
公开课

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

房产要闻

万华对面!海口今年首宗超百亩宅地,重磅挂出!

数码要闻

低至 5747 元,爱普生 CH-TW6280T 真 4K 投影仪京东大促

公开课

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

无障碍浏览 进入关怀版