V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Kcelone
V2EX  ›  Python

Excel 异步上传并处理后导入数据库设计思路及填坑

  •  
  •   Kcelone · 2018-11-01 19:35:02 +08:00 · 1715 次点击
    这是一个创建于 2219 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是对前面一个帖子的补充及填坑。

    之前一个帖子大概说了异步处理 Excel 导入数据库的问题,但留了一个坑。就是那个 celery 的任务注册偶现失败问题。

    技术栈: python3.6.5 ,celery4.2.1,mysql 5.7.22 , sqlalchemy, xlrd,tornado,redis

    设计思路再大概啰嗦一下,顺便解决问题:

    1. 准备材料一份 Excel 报表,利用 tornado.web 库中的 RequestHandler 类 request.files 属性获取到前端传来的文件内容(注:此时获取的数据类型 tornado.httputil.HTTPFile, 格式是 bytes)。

    2. 将前端传来的 bytes 数据直接放入 celery 进行异步处理,发现总是报错,原因是 delay()函数不接受非 JSON 序列化类型的参数(Object of type 'bytes' is not JSON serializable"),然后尝试了利用 encode(xx, 'utf-8')进行转码,又会提示 decoding to str: need a bytes-like object, HTTPFile found"( http 文件不是 bytes 类型对象),算了,退而求其次,先将文件上传然后保存至本地再说

    3. 利用 xlrd 库进行本地临时 Excel 文件读取,这样读取出来的格式为字符串格式,celery 处理毫无障碍,读取之后,可以进行数据重组,获取你想要的数据格式,可能是一个列表,字典,或着其他,同时进行去重,排序等操作。

    4. 数据导入,第一次 code,使用的是 sql 原生语句,包括创建临时表,建索引,去重,插入,这时 celery 有时候会不能正常注册任务,导致任务偶现执行失败。后来,一直找不到原因。先不管别的,保证功能正常,所以又把代码重新撸了遍,弃用原生 sql,改用 sqlalchemy orm 方式,然后偶现问题消失,功能正常支撑。然后回过头来分析日志,查看日志发现 redis 莫名崩溃,由于 redis 做了 celery 的队列,所以导致 Not registered 偶现问题,然后继续分析,发现内存过高,所以确定是内存暴涨引起的,还是自身代码问题。

    5. 出坑要点,在数据插入时,当数据量过大时要进行分批处理,且分次提交,以防内存用尽导致某组件崩溃。

    6. 源码就不贴了,有需要可以联系我

    鄙人搞了个 Python 群,有兴趣的加一下,一起讨论问题,如果有好点子,可以在这里找到一起走的道友。 群号:902788038

    第 1 条附言  ·  2018-11-02 10:21:45 +08:00
    2 条中的 encode 是 decode,打错了,抱歉。
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:53 · PVG 22:53 · LAX 06:53 · JFK 09:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.