项目场景:
使用python
pdfplumber
进行pdf表格解析,导出表格数据
问题描述
由于解析的pdf文件有一万两千页,解析的时候内存直接拉满。但是百度并不能找到解决方案,反而一堆其他的内存泄漏和内存过多的无用的回答。
原因分析:
使用objgraph
进行内存分析的时候,发现dict
类型的数据最多而且随着我读取的页数越多增加。
dict 364731
PDFObjRef 245206
list 52344
tuple 41388
PDFStream 12312
Page 12293
PDFPage 12293
function 4066
LTChar 1802
wrapper_descriptor 1211
weakref 1162
builtin_function_or_method 872
method_descriptor 865
getset_descriptor 698
type 676
PDFGraphicState 607
cell 434
member_descriptor 381
module 250
ModuleSpec 249
SourceFileLoader 198
本以为是我自己使用dict
类型造成的内存泄漏,使用del
和gc.collect()
之后都没有用,于是怀疑是pdfplumber
造成的内存泄漏
解决方案:
使用flush_cache()
方法对pdf的page进行缓存清理
with pdfplumber.open("data/my.pdf") as pdf:
for page in pdf.pages:
run_my_code()
page.flush_cache()