求指导,用 Django 搭了个图像检索引擎,调用 API 前需要对数据做初始化( 300MB+),有什么最佳实践可以参考么?最好能是后台 worker 单独起一个进程处理,但是看了下 celery 这些任务队列好像不支持这样初始化,现在非常蠢的放了全局变量在 views 里,很不方便:
http://ww2.sinaimg.cn/large/82fc1a4dgw1f2f2iciqs6j20rn0artbb.jpg
1
ayang23 2016-03-30 18:39:29 +08:00
不明白楼主是要先加载 300M 数据到一个变量里,然后要使用这个变量,还是对数据库做初始化?
|
3
ayang23 2016-03-30 18:47:39 +08:00 1
如果这个 list 必须完全加载,才能运行你的逻辑,那就只能提前加载到变量里了,用一些延迟加载的方法,可以优化一下有的 view 不需要这个变量的情况。如果这些数据一般不变化,可以把这个 list pickle 后放到 memcache 里。
|
4
hyuwang OP @ayang23 一般不变化 可 memcache 只支持 1MB ,这个 list 本身就会占用 300MB 内存。。然后这个 view 必须要这个变量 所以现在很头痛
|
5
neoblackcap 2016-03-30 19:40:18 +08:00 via iPhone
@hyuwang 换 redis 能否解决?
|
6
22too 2016-03-30 20:01:11 +08:00
我做过最大的, 500M , ip 地址,直接丢到内存,然后第一次加载 1 分钟,以后一般 5 秒完事,所以无所谓了,只要你不重启,一次加载进去就行了。
|
7
hyuwang OP @neoblackcap 不行欸 数据库不在本地
|
8
hyuwang OP @22too 部署到服务器可以用么? gunicorn 这些多进程的好像不行啊 我现在没办法都是直接 runserver
|
9
22too 2016-03-30 21:19:31 +08:00 1
不能多进程,只能部署单个,多进程共享变量好麻烦的,如果必须多进程部署,你就要想办法把数据拆分了,然后放到 redis 中
|
10
ayang23 2016-03-30 22:09:59 +08:00
或者如果使用这 500M 的业务不是 cpu 密集型的,用 tornado 写一个单进程的 web service , django 去调用
|
11
ayang23 2016-03-30 22:12:28 +08:00
pickle 到文件也是个方案,可以测试一下效率。因为操作系统会把最近访问的文件缓存到内存。
|