【发布时间】:2017-09-12 05:54:41
【问题描述】:
我想知道如何加快涉及在大型数据集上进行大量计算的程序的运行速度。所以,我有 5 个 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() 连接到 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 实例会有帮助吗?
对不起,我是新来的,但真的不知道该怎么做。
【问题讨论】:
-
休斯顿,我们有问题。 “我听说 GPU 比 CPU 快 14 倍……在这种情况下使用 GPU 实例会有帮助吗?” 我听说了水产生黄金。这会有帮助吗? 恕我直言,这很严重。大型远程托管数据集上的高度复杂的过程永远不会有资格在 SIMD / SMX GPU 硬件上获得合理的加速,以 将约 12 小时 [SEQ] 处理时间缩短为“我需要整个事情在一个小时”。实事求是,得到定量支持……连续复杂的处理存在问题(参考阿姆达尔定律)
-
如果您的主要过程的 [PAR] 部分没有超过 99%,则 [SEQ] 部分剩余不到 1%,并尽可能避免分布式处理设置/撕裂-降低开销,即使有无限数量的并行处理器,您也永远无法获得您所要求的 12 倍加速。只需收益递减规律解释,为什么这永远不会,确实永远不会发生。可能**使用交互式可视化建模工具进行原型设计/证明这些见解可用于扩展 [SEQ]+[PAR] 时间表:stackoverflow.com/a/46124635
标签: python amazon-web-services amazon-ec2