如何提高集群性能的建议?

15 浏览
0 Comments

如何提高集群性能的建议?

我有一个相对较大的数据集,大约1000个文件,每个文件有1000行,大约1000列。

我正在运行一个算法,在每个步骤中,我需要循环遍历整个数据集,并对这些数据进行矩阵乘法计算(类似于梯度下降算法)。

目前,我将这些数据存储在1000个文件中,每次迭代时,我都会循环遍历文件,打开文件,进行计算,保存结果,然后关闭文件。然后我使用这些结果,并为算法的下一次迭代重复这个过程。这个过程很慢,大约每个步骤需要2秒的时间。我需要进行成千上万次的迭代,这很容易需要几个小时。我正在使用一些并行处理来实现这个:文件可以独立打开,所以我在Python中使用multiprocessing.PoolPool.map来并行地在循环中对每个文件进行分析。

我想知道是否有一种更聪明的方法可以加速计算。我在AWS上有一台拥有大约128个核心的EC2实例。这是几乎最大的实例,但是否有办法将多个实例链接在一起,跨多个核心并行化处理?或者可能有更好的方法来做这个。

0
0 Comments

建议如何改善集群性能

你没有提供足够的信息来得到一个答案,但有三件事可能导致你的性能问题:

- IO时间,每次迭代都需要打开每个文件并读取其内容。

- Python解释时间(更重要的是,将10亿个值作为对象管理所需的时间)。

- GIL(全局解释器锁)。

要了解哪个原因导致了性能问题,你需要测量时间消耗的地方。这可以简单地将一些时间跟踪变量放入你的处理函数中:

import time
def processFile(filename):
    t0 = time.time()
    with open(filename) as f:
        # 读取数据
    t1 = time.time()
    # 做一些操作
    t2 = time.time()
    with open(filename, "w") as f:
        # 写入更新的数据
    t3 = time.time()
    print(f"{t1-t0},{t2-t2},{t3-t2}")

如果`t1-t0`加上`t3-t2`占用了大部分时间,那么你可以通过在程序开始时读取每个文件并将其保存在内存中来解决问题。如果你需要保留中间结果,这种方法将无法使用。

如果问题出现在`t2-t1`,那么你需要将计算移到Python之外。一种常见的方法是使用NumPy,在C中执行计算(还可以以内存高效的方式加载和写入文件)。

你可以通过比较单线程操作和多线程操作的时间来确定是字节码/内存管理还是GIL的问题。如果时间按线程数缩放,那么问题就是GIL。

另外,你可以尝试其他提供更有效的内存管理和更好的线程隔离的语言,如Java / C# / Go / C / C++等,选择你熟悉的语言。

然而,将工作分布到多台计算机上需要付出很大的努力,这是我最后尝试的事情。分配工作和协调结果总是会带来额外的开销,根据我的经验,只有在处理的数据量达到TB级别时才会有回报,而不是GB级别。

0