在单次请求某资源详情页中,计算并返回相似资源。但是如果资源个数太多,请求过程中,会造成很长的计算时间。有什么好的建议或者改进方案吗? - V2EX
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
Alexf4
V2EX    Python

在单次请求某资源详情页中,计算并返回相似资源。但是如果资源个数太多,请求过程中,会造成很长的计算时间。有什么好的建议或者改进方案吗?

  •  
  •   Alexf4
    alexcc4 2017-06-08 14:04:13 +08:00 2648 次点击
    这是一个创建于 3123 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前系统有个场馆模块,每次访问单个场馆详情页的时候,有个相似场馆的数据段 similar_staduims ,这个是每次请求时候,都会去数据库取出所有场馆,然后根据相应的相似权重计算并排序,然后取前几个的值。这样在数据量少的时候没有很大影响(也本着创业公司项目早期 make job done 的想法,先完成需求)。目前场馆数目到达一万的时候,就开始出现请求超时的问题。
    我有考虑到每次请求应该减少计算次数或者是直接不应该把计算过程放在请求响应阶段,权重排序应该作为一个计算队列,定时,或者每当有场馆更改的时候出发全局计算,然后把计算结果存储起来,每次请求只需要取出计算结果即可。但是目前没有一个很清晰的想法。所以想发帖求助。
    技术栈:

    • backend: flask + python3
    • database: postgresql 9.6
    • cache:redis
      先谢谢各位大大。
    9 条回复    2017-06-08 18:22:24 +08:00
    dylanninin
        1
    dylanninin  
       2017-06-08 14:17:36 +08:00
    up
    Immortal
        2
    Immortal  
       2017-06-08 14:25:19 +08:00
    既然用到了 redis
    一个场馆的相似场馆应该在一定时间内固定的才对,不需要每次计算,除非是有新的相似场馆增加,这个为基础
    1\增加缓存,场馆->相似场馆 这个映射关系去处理
    2\异步计算,定期更新缓存
    这样不需要每次重新计算,虽然会丢失一些时效性,但这个可以根据 2 的定期时间来减少误差
    JhZ7z587cYROBgVQ
        3
    JhZ7z587cYROBgVQ  
       2017-06-08 14:26:16 +08:00
    mark,感觉楼主思路是对的啊,场馆录入的时候进行计算,计算完成修改数据库状态表明其可用?
    Immortal
        4
    Immortal  
       2017-06-08 14:27:25 +08:00
    你的考虑和我想法差不多,如果做成你这样的触发机制其实也很简单
    用 redis 的订阅或者阻塞队列作为信号源
    启一个服务专门用来计算,订阅 topic 或者 block pop 来监听计算信号就行了,这个服务只做计算,主服务只读
    Alexf4
        5
    Alexf4  
    OP
       2017-06-08 14:43:58 +08:00
    @Immortal
    > 除非是有新的相似场馆增加,这个为基础 这个相似度,其实都是全局计算后根据匹配的分数排序的。所以如果是计算相似结果这个过程,就看是每次某个新增场馆后者修改现有场馆信息后,要实时触发全局计算,还是对时效性没有这么苛刻,每天定时计算、更新全局的权重数据。我更倾向于后者。感谢你的梳理啊~~
    Alexf4
        6
    Alexf4  
    OP
       2017-06-08 14:47:27 +08:00
    @jason0916 你的思路类似数据变动触发机制吧。
    JhZ7z587cYROBgVQ
        7
    JhZ7z587cYROBgVQ  
       2017-06-08 16:40:31 +08:00
    @Alexf4 恩对的,其实二楼讲得很详细了,而且加入了定时任务做离线计算,感觉已经可以满足需求啦~
    就看你这边愿不愿意为了得到这个数据专门开个服务做了
    Morriaty
        8
    Morriaty  
       2017-06-08 17:33:39 +08:00
    你相似场馆难道还是实时变动的吗

    起程序之前,直接算好整个相似矩阵,之后请求的时候直接读取矩阵就行了。

    然后每天更新一次矩阵,程序重读一次。
    coffeedeveloper
        9
    coffeedeveloper  
       2017-06-08 18:22:24 +08:00 via Android
    每天跑一次计算任务或者说建立触发重新计算的机制,缓存起来,平时只读。不是都是这么做的么
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2867 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 02:58 PVG 10:58 LAX 18:58 JFK 21:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86