2017-09-12 56 views
0

我想知道如何加速運行涉及大量數據集上大量計算的程序。所以,我有5個python程序,每個程序都對大數據集執行一些複雜的計算。例如,在該程序中的一個的部分如下:如何加快計算繁重的python程序的運行時間

df = get_data_from_redshift() 
cols = [{'Col': 'Col1', 'func': pd.Series.nunique}, 
{'col': 'Col2', 'func': pd.Series.nunique}, 
{'col': 'Col3', 'func': lambda x: x.value_counts().to_dict()}, 
{'col': 'Col4', 'func': pd.Series.nunique}, 
{'col': 'Col5', 'func': pd.Series.nunique}] 

d = df.groupby('Column_Name').apply(lambda x: tuple(c['func'](x[c['col']]) for c in cols)).to_dict() 

get_data_from_redshift()其中連接到紅移簇,從數據庫中獲取數據,將其寫入到一個數據幀(在dataframe爲約600,000 rows x 6 columns)。

其他程序也使用此數據框df並執行大量計算,每個程序將其結果寫入pickle文件中。

最終程序加載由5個程序創建的pickle文件,進行一些計算以獲得約300,000個值,然後針對羣集中的另一個數據庫檢查它們以得到final file output

單獨運行每個程序需要花費數小時(有時一夜之間)。但是,我需要整個事情在一個小時內運行,並給我final output file

我試着把一個EC2實例上的程序看看性能是否提高,但它已經超過了3個小時,它仍在運行。我試過m4.xlarge,c4.xlarge,r4.xlarge實例,但沒有一個是有用的。

有沒有辦法加快總運行時間?

也許我可以在單獨的EC2實例上運行5個程序的每一個,但是然後每個程序給出一個輸出文件,最終程序必須使用該文件。所以,如果我運行多個實例,每個程序的輸出文件將保存在不同的服務器上,對吧?那麼最終的程序如何使用它們呢?我們可以將每個文件的輸出文件保存到最終程序可以訪問的公共位置嗎?

我聽說GPU比CPU快14倍,但是我從來沒有用過它們。在這種情況下,使用GPU實例會有幫助嗎?

對不起,我是新來的,但不知道如何去做。

+0

休斯頓,我們有一個問題。 「*我聽說GPU比CPU快14倍......在這種情況下使用GPU實例會有什麼幫助嗎?*」**我聽說過,吹入水中的煙霧會產生黃金。這會有幫助嗎?**儘可能尊重,這是嚴肅的。在大型遠程託管的數據集上進行嚴重卷積的進程將永遠無法在SIMD/SMX GPU硬件上獲得合理的加速,以便將~12小時[SEQ]處理切換爲「*我需要整個事情在一個小時內運行** *」。是現實的,可以得到數量上的支持......連續複雜的加工存在問題(參考Amdahl法則) – user3666197

+0

如果您的主體工藝沒有顯示工藝過程的99%以上[PAR]部分,對[SEQ]部分留下少於1%儘可能避免分佈式處理設置/拆卸開銷,即使使用無限數量的並行處理器,也無法獲得您所要求的約12倍的加速比。簡單的**收益遞減規律**解釋了爲什麼這永遠不會發生,甚至從來沒有**。 May **使用交互式可視化建模工具進行原型設計/驗證這些洞察,可用於縮放[SEQ] + [PAR]時間表:https://stackoverflow.com/a/46124635 – user3666197

回答

2

你需要找出是什麼讓它變慢,你可以使用profiler開始,如果你現在還想不到其他東西。找出確切的問題是使其更好地工作的最簡單方法。

這個,下面是一個通用的方法。

首先,體系結構/算法的優化可以大大優於任何其他優化(比如由編程語言,工具甚至諸如記憶等技術提供的優化)。所以首先仔細看看你的算法是否可以改進。它包括尋找可以並行運行的部件,可以並行執行。例如,使用map-reduce而不是線性數據處理可以將執行時間降低到分數!但它需要處理應該能夠被分開(相互排斥)並行處理。

接下來應該找到不必要的循環或計算。使用像memoization技術也可以大大提高性能。

如果有任何通信或I/O任務(例如,溝通到你提到的紅移羣集),這是時間(這似乎並沒有涉及到你,因爲你已經表明擔心計算緩慢)

然後有一些小的優化,如使用像地圖,過濾器或使用生成器表達式而不是列表等可以稍微優化(非常)。