当前位置: 首页 > news >正文

记一次 pdfplumber 内存泄漏导致的服务器宕机

有一个项目需求,要在每天凌晨5点的时候执行一个任务,获取一系列的PDF文件并解析。

后端是Django框架,定时任务用Celery来实现的。

本地跑没什么问题,但是一放到服务器上跑就会宕机,而且是毫无征兆的宕机,至少在宝塔面板上看到的宕机前的负载、CPU使用率和内存占用率还是正常的。

一开始以为是Celery的问题,但是排查了很久都没发现有啥问题,尤其是这个脚本在本地是可以跑的。

于是我就不通过Celery,手动执行了一下这个脚本,通过逐行打印的方式,定位到了问题函数。

    def process_pdf(self):for i in range(len(self.pdf.pages)):print(f"正在处理第 {i} 页……")page = self.pdf.pages[i]self.extract_text_and_tables(page)

这个函数就是遍历PDF的每一页,然后提取这一页的文本和表格。

在执行这个函数的过程中,通过 htop 命令实时观察内存占用,发现随着处理的页面越来越多,占用的内存也越来越多,直到服务器完全卡住,宕机了。

在这里插入图片描述

所以问题就很明显了,服务器的资源不够,内存占满了,所以才导致了宕机。

我是通过 pdfplumber 加载的 PDF 文件,所以自然而然的去 pdfplumber 的 GitHub 上看看有没有人遇到类似的问题,果然找到了一个。

Memory issues on very large PDFs

其中提到了一些方法,综合了一下,修改代码如下。

    def process_pdf(self):for i in range(len(self.pdf.pages)):print(f"正在处理第 {i} 页……")page = self.pdf.pages[i]self.extract_text_and_tables(page)# 清理缓存,避免内存泄漏# https://github.com/jsvine/pdfplumber/issues/193del page._objectsdel page._layoutpage.flush_cache()gc.collect()

问题解决!


其实一开始也想到了可能是机器资源不行,毕竟是比较低配的机器,还抱怨过要是有钱买服务器就好了。

但是发现问题并解决问题之后,更多的其实是有一些羞愧,自己还是太菜了,代码有漏洞。

再想想当年阿波罗登月的时候,计算机内存只有几十 KB,就这样人家都能上月球,现在服务器内存都 2G 了,还不知足。

菜就多练,今天这次之后,处理这种大文件就记得要关注内存泄漏的问题了。

http://www.lryc.cn/news/330500.html

相关文章:

  • SpringBoot单元测试剖析
  • 【华为OD机试C++】计算某字符出现次数
  • ORA-01779 BYPASS_UJVC 11.2后废弃了
  • 验证码demo(简单实现)
  • C#面:虚函数和抽象函数的区别
  • Vidmore Video Fix for Mac 视频修复工具
  • Docker容器与虚拟化技术:OpenEuler 部署 Docker UI
  • 328——二维矩阵值变为1最小操作次数 next、nextInt、nextLine
  • HarmonyOS 应用开发之同步任务开发指导 (TaskPool和Worker)
  • 基于MiniExcel的三种常用导出Excel方法(固定列导出、动态列导出、按模板导出)
  • MATLAB科研绘图与学术图表绘制从入门到精通
  • C++核心高级编程 --- 1、内存分区模型 2、引用
  • winform日历控件_进度条控件
  • Java进阶-反射的详解与应用
  • 蓝桥杯算法题——暴力枚举法
  • 【教程】Kotlin语言学习笔记(六)——泛型
  • 【中文视觉语言模型+本地部署 】23.08 阿里Qwen-VL:能对图片理解、定位物体、读取文字的视觉语言模型 (推理最低12G显存+)
  • 【Qt 学习笔记】Qt 背景介绍
  • C++递推算法
  • Go项目结构整洁实现|GitHub 3.5k
  • Python读取PDF文字 去掉页眉页脚
  • Linux:入门篇
  • NSSCTF Round#20 Basic 真亦假,假亦真 CSDN_To_PDF V1.2 出题笔记 (附wp+源码)
  • 处理关于 React lazy 白屏的两种方案
  • Nginx 基础
  • C++完美转发(适合小白)
  • 如何创建自己的 Spring Boot Starter 并为其编写单元测试
  • C++ :STL中deque的原理
  • AttributeError: ‘Namespace‘ object has no attribute ‘EarlyStopping‘
  • 深度学习pytorch——卷积神经网络(持续更新)