2017-09-12 19 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任务(例如,沟通到你提到的红移群集),这是时间(这似乎并没有涉及到你,因为你已经表明担心计算缓慢)

然后有一些小的优化,如使用像地图,过滤器或使用生成器表达式而不是列表等可以稍微优化(非常)。