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

感謝各位熱心網友


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM