面试题:海量PDF的OCR处理思路

关键点:

  • 1000wPDF:数据量非常大。

  • 3天处理完:有时间限制。

  • 一篇PDF1~10s:可能需要以最高10s去做计算,这样时间才能保证留有富余。

  • 要求资源最大化利用:也就是尽可能节省服务器资源,能复用尽量复用,包括应用服务器和OSS服务资源。

  • 服务器都是阿里云的:可以假设都在同一个机房,忽略网络I/O时长损耗,这样可以用本地耗时作为计算的依据。
    时间计算:

  • 假如一篇PDF处理10s,三天一台机器处理32460*6=25920(份)PDF。

  • 假如一篇PDF处理1s,三天一台机器处理32460*60=259200(份)PDF。

也就是一台机器三天处理量最多259200,最少处理25920份。那么1000w最多需要10000000/25920 ≈ 386台机器,最少需要39台机器。
优化思路:

思路一:动态缩容 ,先以386台机器并行处理,假设第一天处理数据量超过三分之一,此时计算剩余待处理量按10s算需要多少台机器,理论上所需机器数N<=386。机器数可减少到N台,再过一天后再次计算所需机器数newN<=386,机器数再次缩减到386台。也就是我们将时间段分成了3份,因为一篇PDF处理时长1~10s,所以每次一定是可以缩减0-N台服务器。这个分段可以更细到9段、24段、72段等,这样可以更多地缩减服务器数量。

思路二:多线程 ,鉴于现在一台服务器一般情况下是多核的CPU,所以可以充分利用多线程的优势。使用线程池可以更好地避免线程的创建和销毁的损耗,这里的处理程序可以使用线程池来进行相应处理。线程数建议按CPU核心数 *(1+平均等待时间/平均工作时间)计算。

思路三:分布式任务调度,由于有多线程+多实例,所以需要有一个高效的分布式调度组件来进行任务分配,避免资源的竞争和任务失败重试等。这个可以使用一些分布式任务调度框架,如XXL-JOB,基于自己的业务属性自主开发一个任务调度平台。或者可以使用消息中间件的方式进行任务的生产+消费,消息中间件消费一般是自带多线程的。

相关推荐
xu_yule8 分钟前
算法基础-背包问题(01背包问题)
数据结构·c++·算法·01背包
我不是小upper19 分钟前
从理论到代码:随机森林 + GBDT+LightGBM 融合建模解决回归问题
人工智能·深度学习·算法·随机森林·机器学习·回归
王中阳Go22 分钟前
我辅导400+学员拿Go Offer后发现:突破年薪50W,常离不开这10个实战技巧
后端·面试·go
budingxiaomoli30 分钟前
分治算法-快排
数据结构·算法
无知的前端39 分钟前
一文精通-Mixin特性
flutter·面试·dart
云泽80841 分钟前
C++ STL 栈与队列完全指南:从容器使用到算法实现
开发语言·c++·算法
前端小白在前进1 小时前
力扣刷题:复原IP地址
tcp/ip·算法·leetcode
yaoh.wang2 小时前
力扣(LeetCode) 94: 二叉树的中序遍历 - 解法思路
python·算法·leetcode·面试·职场和发展·二叉树·跳槽
Evand J2 小时前
【课题推荐】基于视觉(像素坐标)与 IMU 的目标/自身运动估计(Visual-Inertial Odometry, VIO),课题介绍与算法示例
人工智能·算法·计算机视觉
xu_yule2 小时前
算法基础(背包问题)—分组背包和混合背包
c++·算法·动态规划·分组背包·混合背包