有没有了解 paddleocr 的 V 友,我用 Flask 写了个简易 API,内存占用会越来越大, 4~6 个小时就把机器 64GB 内存占满了,只能用 cron 每小时重启,是内存泄露的问题吗

查看 132|回复 12
作者:drymonfidelia   
这是我的代码,因为我平时 python 写得少,不熟练,如果代码质量差请别喷
import json, re
import uuid
from urllib.parse import quote, unquote
import yaml
import os, urllib.request
import time
from flask import Flask, config, render_template, request, redirect, make_response
from paddleocr import PaddleOCR, draw_ocr
ocr = PaddleOCR(use_angle_cls=True, lang='en')
app = Flask(__name__)
@app.route('/ocr', methods=['GET'])
def do_ocr():
    if request.method == 'GET':
        data = request.args
    if 'url' in data:
        url = unquote(data['url'])
    else:
        return ""
    tmp_path = f"/dev/shm/{uuid.uuid4()}"
    urllib.request.urlretrieve(url, tmp_path)
    result = ocr.ocr(tmp_path, cls=True)
    data = ""
    for recr in result:
        rec = recr[1][0].upper()
        data += rec + ","
    os.remove(tmp_path)
    return data.strip(",")
if __name__ == '__main__':
    app.run()
ocrapi.py 是从别处复制来的猴子补丁(不然好像并发会有问题)
from gevent import monkey, pywsgi
monkey.patch_all()
from app import app
用了 supervisor 启动:
[program:ocrapi]
command=gunicorn --workers 6 --worker-class=gevent --worker-connections=50 -b 0.0.0.0:8080 ocrapi:app
directory=/opt/ocrapi/
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/ocrapi.log
loglevel=info
服务启动时内存占用在 2GB 左右,随后越来越大
另外想问下如果只是用于识别包装盒上的产品序列号(大写英文数字组成,位数固定,手机拍照的,白底黑字/黑底白字都有可能)有效果更好的方案吗?
ggvm   
查一下具体的内存是被什么东西占用了?
估计是模型被多次加载,但从来不释放?
Puteulanus   
ocr = PaddleOCR(use_angle_cls=True, lang='en')
这个要是放 do_ocr 里面呢
我之前看别人另一个识别的用的 https://cnocr.readthedocs.io/zh/latest/usage/
drymonfidelia
OP
  
@Puteulanus 如果是这个要放进去的原因,为什么放外面反而会被多次加载?放外面不是更应该不会被多次加载么?
Puteulanus   
@drymonfidelia 我的意思是既然感觉 PaddleOCR 有问题,就别维持它的全局对象了,没有引用看垃圾回收能不能收了它
est   
@drymonfidelia 可能是 ocr 对象维持了一些历史记录。你扫一次内存就占着不释放了。
ClericPy   
如果对这个库不了解, 可以在子进程里初始化它, 子进程销毁的时候就清理了. 不过估计会慢... 优化的地方很多
drymonfidelia
OP
  
@Puteulanus 但是每次 ocr 都加载一次模型感觉会很慢
kaneg   
/dev/shm/这个是在内存的,会不会文件没有删掉,滞留在内存了
drymonfidelia
OP
  
@kaneg 我看 top 是 gunicorn 这个进程占的内存
您需要登录后才可以回帖 登录 | 立即注册

返回顶部