问个 Python 新手问题

2016-03-30 18:34:37 +08:00
 hyuwang

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

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

2628 次点击
所在节点    Python
12 条回复
ayang23
2016-03-30 18:39:29 +08:00
不明白楼主是要先加载 300M 数据到一个变量里,然后要使用这个变量,还是对数据库做初始化?
hyuwang
2016-03-30 18:42:18 +08:00
@ayang23 从数据库加载数据,再把它变成一个 list
ayang23
2016-03-30 18:47:39 +08:00
如果这个 list 必须完全加载,才能运行你的逻辑,那就只能提前加载到变量里了,用一些延迟加载的方法,可以优化一下有的 view 不需要这个变量的情况。如果这些数据一般不变化,可以把这个 list pickle 后放到 memcache 里。
hyuwang
2016-03-30 18:50:16 +08:00
@ayang23 一般不变化 可 memcache 只支持 1MB ,这个 list 本身就会占用 300MB 内存。。然后这个 view 必须要这个变量 所以现在很头痛
neoblackcap
2016-03-30 19:40:18 +08:00
@hyuwang 换 redis 能否解决?
22too
2016-03-30 20:01:11 +08:00
我做过最大的, 500M , ip 地址,直接丢到内存,然后第一次加载 1 分钟,以后一般 5 秒完事,所以无所谓了,只要你不重启,一次加载进去就行了。
hyuwang
2016-03-30 20:38:28 +08:00
@neoblackcap 不行欸 数据库不在本地
hyuwang
2016-03-30 20:40:12 +08:00
@22too 部署到服务器可以用么? gunicorn 这些多进程的好像不行啊 我现在没办法都是直接 runserver
22too
2016-03-30 21:19:31 +08:00
不能多进程,只能部署单个,多进程共享变量好麻烦的,如果必须多进程部署,你就要想办法把数据拆分了,然后放到 redis 中
ayang23
2016-03-30 22:09:59 +08:00
或者如果使用这 500M 的业务不是 cpu 密集型的,用 tornado 写一个单进程的 web service , django 去调用
ayang23
2016-03-30 22:12:28 +08:00
pickle 到文件也是个方案,可以测试一下效率。因为操作系统会把最近访问的文件缓存到内存。
hyuwang
2016-03-30 22:35:02 +08:00
@ayang23 感谢!

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

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

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

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

© 2021 V2EX