首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

Python 小白求助,如何快速循环百万条数据?

  •  
  •   klgd · 96 天前 · 2489 次点击
    这是一个创建于 96 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从 mongo 里读取用户数据
    然后使用 jieba.analyse.extract_tags 进行提词
    而且是对用户的几个属性进行提词,每个属性只取部分(权重较大的)
    分词结果保存到 mongo 里

    目前问题是: 1、单个用户提词速度感觉不慢,但是百万数据就要循环好久(目前本地测试 5 万数据都要 3 小时)
    2、用户的几个属性分别提词,跟属性合并后提词,结果是否一样呢?

    请大家指教一下 我该如何优化?

    18 回复  |  直到 2018-03-15 20:20:29 +08:00
        1
    Karblue   96 天前
    看问题是出在数据库上还是 python 上。百万数据可能是从 db 拉取到本地时间过长。如果是 python 内循环处理时间过长。可以考虑多进程或者多线程处理。如果是 DB 上的问题。就用空间换时间吧。。
        2
    zhangsen1992   96 天前
    多进程?
        3
    CallMeHoney   96 天前
    多进程 or 任务队列?
    合并后效率一样的,因为总的文本量并没有变
        4
    regicide   96 天前
    先把数据拉到内存里,然后用 pandas 操作
        5
    klgd   96 天前
    @Karblue #1 应该是内循环时间太长了 我们一次取 5 万条数据,for 循环需要 2~3 小时
    @zhangsen1992 #2 有在考虑如何实现多进程,不过新手,还在学习呢
    @CallMeHoney #3 我是想问几个属性合并后提词的结果跟每个属性提词的结果合并一样吗?
    @regicide #4 好的,我去学学 pandas 如何使用
        6
    diggerdu   96 天前 via iPhone
    直接 multiprocessing.mapreduce 一句话的事
        7
    diggerdu   96 天前 via iPhone
    @diggerdu *.map
        8
    dd99iii   96 天前
    multiprocessing.pool
        9
    klgd   95 天前
    @diggerdu #6
    @dd99iii #8

    指定的是用 multiprocessing.Pool 类的 map 方法吗?
        10
    diggerdu   95 天前 via iPhone
    @klgd 是的,这样也不用改代码
        11
    ZoomQuiet   95 天前 via iPhone
    是也乎 ╮(╯▽╰)╭

    直觉上…这业务不用在线就地计算的吧?

    利用 mongoDB 的自动备份…将全数据…同步到另一主机…

    用管理工具…将需要的数据定期 dump 到硬盘为 .csv .json 之类文本…

    用 split 之类工具切开…

    分别 丢给多个 python 进程…

    仅将分词结果写回 mongoDB ?

    这样不占用业务响应资源…
    又最大化吞吐量…
    同时…也免去了直拉 DB 的各种问题?

    更重要的是…一切都是隔离可控的?
        12
    nature91   95 天前
    @ZoomQuiet 擦 忘记大佬叫啥了 活捉大神!!!!!
        13
    geek123   95 天前
        14
    yumenlong   95 天前
    感觉应该提词这比较慢,可以考虑用队列,mongo 读出数据丢到 redis 队列,然后多个消费者从队列消费提词。
        15
    ucando   95 天前
    对于第二条问题, 建议你所有属性合并后处理, 只要用分割符号(比如逗号)把属性连起来就行了, 这样分词效率要高很多.
        16
    dd99iii   95 天前
    @klgd 看大神的回答,不止并发的问题,也许架构上也要重新想一想
        17
    WaterTr   95 天前
    import multiprocessing as pro

    def work(string):
    print (string)

    if __name__ == '__main__':
    p = pro.Pool()
    with open('url.txt', encoding='utf-8') as url_list:
    for url_per in url_list:
    p.apply_async(work, args=(url_per,))
    p.close()
    p.join()

    0-0 贴一个多进程的简单例子
        18
    WaterTr   95 天前
    @WaterTr 缩进乱了。。。自己改一下 XD
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1780 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 21ms · UTC 13:14 · PVG 21:14 · LAX 06:14 · JFK 09:14
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1