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
hyuwang
V2EX  ›  Python

问个 Python 新手问题

  •  
  •   hyuwang · 2016-03-30 18:34:37 +08:00 · 2610 次点击
    这是一个创建于 3153 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求指导,用 Django 搭了个图像检索引擎,调用 API 前需要对数据做初始化( 300MB+),有什么最佳实践可以参考么?最好能是后台 worker 单独起一个进程处理,但是看了下 celery 这些任务队列好像不支持这样初始化,现在非常蠢的放了全局变量在 views 里,很不方便:

    http://ww2.sinaimg.cn/large/82fc1a4dgw1f2f2iciqs6j20rn0artbb.jpg

    12 条回复    2016-03-30 22:35:02 +08:00
    ayang23
        1
    ayang23  
       2016-03-30 18:39:29 +08:00
    不明白楼主是要先加载 300M 数据到一个变量里,然后要使用这个变量,还是对数据库做初始化?
    hyuwang
        2
    hyuwang  
    OP
       2016-03-30 18:42:18 +08:00
    @ayang23 从数据库加载数据,再把它变成一个 list
    ayang23
        3
    ayang23  
       2016-03-30 18:47:39 +08:00   ❤️ 1
    如果这个 list 必须完全加载,才能运行你的逻辑,那就只能提前加载到变量里了,用一些延迟加载的方法,可以优化一下有的 view 不需要这个变量的情况。如果这些数据一般不变化,可以把这个 list pickle 后放到 memcache 里。
    hyuwang
        4
    hyuwang  
    OP
       2016-03-30 18:50:16 +08:00
    @ayang23 一般不变化 可 memcache 只支持 1MB ,这个 list 本身就会占用 300MB 内存。。然后这个 view 必须要这个变量 所以现在很头痛
    neoblackcap
        5
    neoblackcap  
       2016-03-30 19:40:18 +08:00 via iPhone
    @hyuwang 换 redis 能否解决?
    22too
        6
    22too  
       2016-03-30 20:01:11 +08:00
    我做过最大的, 500M , ip 地址,直接丢到内存,然后第一次加载 1 分钟,以后一般 5 秒完事,所以无所谓了,只要你不重启,一次加载进去就行了。
    hyuwang
        7
    hyuwang  
    OP
       2016-03-30 20:38:28 +08:00
    @neoblackcap 不行欸 数据库不在本地
    hyuwang
        8
    hyuwang  
    OP
       2016-03-30 20:40:12 +08:00
    @22too 部署到服务器可以用么? gunicorn 这些多进程的好像不行啊 我现在没办法都是直接 runserver
    22too
        9
    22too  
       2016-03-30 21:19:31 +08:00   ❤️ 1
    不能多进程,只能部署单个,多进程共享变量好麻烦的,如果必须多进程部署,你就要想办法把数据拆分了,然后放到 redis 中
    ayang23
        10
    ayang23  
       2016-03-30 22:09:59 +08:00
    或者如果使用这 500M 的业务不是 cpu 密集型的,用 tornado 写一个单进程的 web service , django 去调用
    ayang23
        11
    ayang23  
       2016-03-30 22:12:28 +08:00
    pickle 到文件也是个方案,可以测试一下效率。因为操作系统会把最近访问的文件缓存到内存。
    hyuwang
        12
    hyuwang  
    OP
       2016-03-30 22:35:02 +08:00
    @ayang23 感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2739 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 12:45 · PVG 20:45 · LAX 04:45 · JFK 07:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.