Python处理大数据

时间:2022-08-01 18:21:10
起因

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

感谢各位热心网友