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

2024-04-06 21:38:15 +08:00
 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 左右,随后越来越大

另外想问下如果只是用于识别包装盒上的产品序列号(大写英文数字组成,位数固定,手机拍照的,白底黑字/黑底白字都有可能)有效果更好的方案吗?

4730 次点击
所在节点    Python
28 条回复
clemente
2024-04-07 22:52:55 +08:00
不要用 paddle 百度都快放弃了
CHchenkeyi
2024-04-09 15:15:38 +08:00
至少代码没看出来由啥问题
CHchenkeyi
2024-04-09 15:16:35 +08:00
做了很多飞桨的,基本上有问题就是 版本问题,要么更新 paddle 版本,要么更新 ocr 版本。很玄学
drymonfidelia
2024-07-18 17:41:05 +08:00
@CHchenkeyi 更新了最新版更离谱了,运行半分钟 100%用完内存
so1n
2024-07-18 19:48:47 +08:00
遇到内存溢出问题,都是用 gunicorn 的 max_requests
yinmin
2024-07-18 23:51:29 +08:00
@drymonfidelia 25 楼是正解。gunicorn 加参数 --max-requests 1000 试试
(每个 worker 接收到 1000 次请求后就重启一个新的)

你自己测试一下 max-requests 用 500 、1000 、5000 、10000 哪个更优化。
mMartin
2024-07-19 10:57:52 +08:00
把 OCR 单独封装个单例试试 paddleOCR 我至少在十个生产环境用 还真没遇到内存泄露
mMartin
2024-07-19 11:01:33 +08:00
要么就把 OCR 单独封装一个服务 RPC 调用 我检测分割分类和 OCR 经常一起用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1030071

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX