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

遍历表方案

  •  
  •   itertools · 2017-07-06 21:30:13 +08:00 · 2543 次点击
    这是一个创建于 2679 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一次请求需要从提交的数据中获取一个数组 A,然后,从数据库中遍历某张表的字段 B。最后通过一系列的计算(计算过程包含数组 A 和 B ),每条数据算出一个值,取最高的几个值返回给请求方?请问这样需求有什么好的实现方案,响应时间越短越好。 谢谢!

    10 条回复    2017-07-07 17:06:24 +08:00
    Immortal
        1
    Immortal  
       2017-07-06 21:55:02 +08:00
    能看懂有鬼了- -
    Hieast
        2
    Hieast  
       2017-07-06 22:04:57 +08:00
    楼主名字很好玩,itertools,再加个 nlargest、map, 应该可以解决楼主的问题了。
    itertools
        3
    itertools  
    OP
       2017-07-06 22:22:46 +08:00
    @Hieast nlargest 在我的实现中用到了,但是遍历表(如果有表中有上千万条数据),感觉响应时间很慢。
    uxstone
        4
    uxstone  
       2017-07-06 22:35:46 +08:00
    找个合适的数据结构,先把表中的数据取出来,在代码中写具体的运算逻辑 ?
    itertools
        5
    itertools  
    OP
       2017-07-06 22:47:30 +08:00
    @uxstone 数据量太大。内存可能会爆。
    Hieast
        6
    Hieast  
       2017-07-06 23:25:15 +08:00 via Android
    @itertools 流式计算?维护一个 n 个元素的最大堆,用 generator 取一定数量的 B,更新这个堆?

    不过估计这种实现不会比你现在的速度快多少。
    愿意折腾的话用 spark sql ?
    cszeus
        7
    cszeus  
       2017-07-07 03:33:00 +08:00
    在 B 上面建索引,然后用多线程或者多进程,把 B 里面的东西分成多个部分取出来,分别算,再一起取最大?

    本来上千万条的数据,不需要分表么?
    lxml
        8
    lxml  
       2017-07-07 08:43:34 +08:00 via Android
    虽然不太清楚具体 B 是什么数据,但一个思路吃把 B 按照跳表的方式弄个多层索引,尽快的优化找 B 的速度。
    Miy4mori
        9
    Miy4mori  
       2017-07-07 09:42:25 +08:00 via iPhone
    我觉得直接用存储过程快吧,要是读到代码里再算估计 io 开销就够喝一壶了。
    caniuse
        10
    caniuse  
       2017-07-07 17:06:24 +08:00
    感觉适合用 mapreduce 思想,把任务分割成小任务分配到其他机器上并行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3130 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 13:52 · PVG 21:52 · LAX 05:52 · JFK 08:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.