• Python处理大数据


    起因

    Python处理一下数据,大概有六七个G,然后再存到另外一个文件中,单线程跑起来发现太慢了,数据总量大概是千万行的级别,然后每秒钟只能处理不到20行……遂想怎么提高一下速度

    尝试1-multiprocessing

    代码如下:

    from multiprocessing.dummy import Pool as ThreadPool
    
    pool = ThreadPool(20)
    pool.map(func_name, args)
    pool.close()
    pool.join()
    

    这里参考了这篇文章,然后尝试了一下,发现速度并没有多少提示,看了一下资源使用率,只占满了1个核,不能满足要求

    尝试2-dask

    dask是一个用于大规模数据存储与读取、并行计算的库,项目地址:https://github.com/dask

    代码如下:

    from dask import delayed
    
    import dask.bag as db
    L = []
    for fn in encrypt_files:
        b = db.read_text(fn)
        a = delayed(decrypt_file)(fn)          # Delay execution of function
        L.append(a)
    result = delayed(L)
    result.compute()
    

    这个地方参考了这篇文章,但是尝试了一下,还是只跑了一个核,依然失败

    尝试3-pp

    pp也是并行计算的库,项目地址:http://www.parallelpython.com/

    代码如下:

    cpu_num = 1
    job_server = pp.Server(cpu_num)
    a =  []
    for f in fn:
    	a.append(job_server.submit(fun_name, (f, ), (fun_1, fun_2, ), ('sys', 'datetime', 'pp', )))
    for x in a:
    tmp = x()
    

    这里参考这篇文章,测试了一下,可以跑满多个核心,其使用的CPU核心数量就是设定的那个数量。

    但是也存在一个问题,就是程序跑一段时间后就会效率下降,监控一下CPU发现也只剩下一个核心在跑了,目前还不知道是什么原因,也没有深究

    对比

    平时最常有的应该是multiprocessing模块,网上的资料大多也都是这个,做数据分析的可能dask模块会用到,pp模块就更少了。但是实际上在我这里测试,前两者达不到我的要求,其最多也跑了一个核心,不知道是不是我代码使用的问题。

    至于pp模块,需要注意的是全局变量的定义,可能需要在函数里重新定义,不然可能会提示变量未定义的错误。

    过程

    开始尝试的时候效果不尽人意,在v2ex上问了一下大家,可以围观下面这两个帖子:

    其实最终也没有达到我的要求,还存在着一部分问题,可能最终还是需要靠集群去实现这个方案。

    感想

    围观v2的帖子,发现其实找出瓶颈才是最关键的…最终发现我的瓶颈是在处理数据的部分,RSA解密太耗时了,然后就应该考虑怎么提高这部分效率。

    有人说换语言,实际上提高十倍也并不满足这个要求,可能提高十倍效率同时使用多核心可以满足…这个时候就该考虑换个思路了

    比方说用集群(还未实现),或则说直接换语言,同时跑多核心。

    PS

    感谢各位热心网友

  • 相关阅读:
    k8s令牌登录设置方法
    etcd查看集群信息
    go Map
    go 切片重组
    go For-range结构
    go 切片
    go 数组与切片
    go 内存优化
    go 格式化输出
    go 闭包函数
  • 原文地址:https://www.cnblogs.com/wswang/p/7718007.html
Copyright © 2020-2023  润新知