起因
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
感謝各位熱心網友