Parallel Python(pp)分散式計算框架安裝和配置問題(基於win10系統)
“分散式計算”也是當今IT行業的一個非常火熱的名詞,大家都知道的谷歌機房,還有2013年諾貝爾物理學獎獲獎專案“希格斯波色子”,都利用了“分散式計算”來分擔一部分計算量從而提高計算效率,尤其在資料科學領域“分散式計算”起到舉足輕重的作用。
ParallelPython簡稱pp,是一個基於Python的分散式計算框架,有很多朋友都會用到。
別的也不多說,迴歸主題,可能有很多像我一樣的剛剛接觸Python又獨愛win10的菜鳥,在使用“pip install pp”安裝pp時都會遇到各種安裝錯誤導致無法安裝。
比如這樣:
可能在官網下載了wheel檔案安裝時也會遇到錯誤,比如下圖:
於是按照提示去檢查程式碼,但並未找到問題:
那這下該怎麼辦呢?
然後找到“Windows installer”,這是一個pp的exe格式安裝包,官網上有兩個“Windows installer”,根據自己需要的版本進行下載。如下圖:
筆者下載的是最新的pp-1.6.6.exe md5,下載後會得到如下檔案:
現在開啟剛剛下載的“pp-1.6.6.exe”,進入到以下安裝介面:
點選“下一步”,這時我們進入到配置環境,pp安裝時會自動掃描自己電腦裡安裝的Python環境,有很多朋友會像我一樣同時安裝了兩個甚至多個版本的Python,此時我們只需要選擇一個我們要使用的Python版本進行安裝,在這裡我選擇的是Anaconda的Python3.6,至於“Python Directory”和“Installation Directory”的路徑也是自動搜尋到的,不用管它,然後點選“下一步
(ps:在這裡我強烈建議大家使用Anaconda,尤其是處理資料科學的朋友,Anaconda是一個非常棒的管理庫的程式,安裝時自帶了基本所有要用到的庫,也可以手動安裝一些第三方庫,更關鍵的是,有圖形介面,不是黑框框!可以不用pip!像我這種懶蛋,點點滑鼠就能安裝很多第三方庫!)
進入到以下介面,繼續點選“下一步”:
一秒鐘後,我們的安裝就結束了,點選“完成”:
現在已經安裝好了,但是這樣就結束工作了嗎?
等等!還沒完!!!
當我們真的要使用pp時,可能會遇到這個問題:
原因很簡單,是因為pp的版本out了。因為這個版本是2017年更新的,而我們用到的Python版本可能是新版,比如我使用的是Python3.6.5,而新版本的語法有些改變,print
首先進入到我們的Python所在的資料夾“Lib\site-packages”(Anaconda的使用者為:Anaconda3\Lib\site-packages),找到“pp.py”,然後用編輯器將其開啟,進行修改:
改為以下:
在第121行改為:print(sout),
第534行至第555行改為:
這裡我附上程式碼:
print ("Job execution statistics:")
walltime = time.time() - self.__creation_time
statistics = self.get_stats().items()
totaljobs = 0.0
for ppserver, stat in statistics:
totaljobs += stat.njobs
print (" job count | % of all jobs | job time sum | " \
"time per job | job server")
for ppserver, stat in statistics:
if stat.njobs:
print( " %6i | %6.2f | %8.4f | %11.6f | %s" \
% (stat.njobs, 100.0*stat.njobs/totaljobs, stat.time,
stat.time/stat.njobs, ppserver, ))
print( "Time elapsed since server creation", walltime)
print (self.__active_tasks, "active tasks,", self.get_ncpus(), "cores")
if not self.__accurate_stats:
print( "WARNING: statistics provided above is not accurate" \
" due to job rescheduling")
print
同時把開頭的匯入部分改為:
import os
import threading
import logging
import inspect
import sys
import types
import time
import atexit
import pickle
import pptransport
import ppauto
import ppcommon
然後在與“pp.py”相同的根目錄“site-packages”資料夾裡找到“pptransport.py”,用編輯器開啟,把第171至第187行改為:
def send(self, data):
size = struct.pack("!Q", len(data))
t_size = struct.calcsize("!Q")
s_size = 0
while s_size < t_size:
p_size = self.socket.send(size[s_size:])
if p_size == 0:
raise RuntimeError("Socket connection is broken")
s_size += p_size
t_size = len(data)
s_size = 0
while s_size < t_size:
p_size = self.socket.send(data[s_size:])
if p_size == 0:
raise RuntimeError("Socket connection is broken")
s_size += p_size
好了,此時我們試試能不能正常匯入pp了
可以了,大功告成!
感謝您的耐心閱讀與支援^_^
作者:Nick.ZLS(超可愛的小松鬆)
獵戶座分析團隊菜鳥級量化分析師