【问题标题】:Running multiple instances of a python program efficiently & economically?高效且经济地运行多个 python 程序实例?
【发布时间】:2010-08-29 18:26:49
【问题描述】:

我编写了一个程序,该程序调用具有以下原型的函数:

def Process(n):

    # the function uses data that is stored as binary files on the hard drive and 
    # -- based on the value of 'n' -- scans it using functions from numpy & cython.    
    # the function creates new binary files and saves the results of the scan in them.
    #
    # I optimized the running time of the function as much as I could using numpy &  
    # cython, and at present it takes about 4hrs to complete one function run on 
    # a typical winXP desktop (three years old machine, 2GB memory etc).

我的目标是以最快、最经济的方式准确运行此函数 10,000 次(对于 10,000 个不同的 'n' 值)。在这些运行之后,我将拥有 10,000 个不同的二进制文件,其中包含所有单独扫描的结果。请注意,每个“运行”函数都是独立的(也就是说,各个运行之间没有任何依赖关系)。

所以问题是这样的。家里只有一台电脑,很明显,我需要大约 4.5 年(10,000 次运行 x 每次运行 4 小时 = 40,000 小时 ~= 4.5 年)才能在家完成所有运行。然而,我希望在一两周内完成所有的运行。

我知道解决方案将涉及一次访问许多计算资源。最好的(最快/最实惠,因为我的预算有限)的方法是什么?我必须买一个强大的服务器(它会花多少钱?)或者我可以让这个在线运行吗?在这种情况下,这样做是否会暴露我的专有代码?

如果有帮助,'Process()' 的每个实例只需要大约 500MB 的内存。谢谢。

【问题讨论】:

  • Process 是做什么的?如果没有更多信息,我认为将速度提高 2 倍以上并不容易(假设双核)。
  • KennyTM:感谢您的回答。即使运行时间减少一半(这不太可能),我仍然需要 2.5 年才能运行所有内容。因此,这里的重点是问题的并行化方面。如果您对此有一个好主意,那就太好了。

标签: python numpy cython


【解决方案1】:

查看 PiCloud:http://www.picloud.com/

import cloud
cloud.call(function)

也许这是一个简单的解决方案。

【讨论】:

  • 非常有趣。感谢您提请我注意。
【解决方案2】:

Process 是直接访问二进制文件上的数据还是将其缓存在内存中?减少 I/O 操作的使用应该会有所帮助。

另外,是否可以将Process 分解为并行运行的单独函数?函数内部的数据依赖如何?

最后,您可以试一试Amazon EC2 之类的云计算服务(不要忘记阅读this 以了解工具),但这并不便宜(EC2 起价为每小时 0.085 美元)- 另一种选择会去有计算机集群的大学(现在很常见,但如果你认识那里的人会更容易)。

【讨论】:

  • bnery:二进制文件没有缓存在内存中,因为它们太大而无法放入内存。我使用 numpy 的 mmap() 读取文件,速度非常非常快。
【解决方案3】:

嗯,根据您的描述,听起来事情是受 IO 限制的......在这种情况下,并行性(至少在一个 IO 设备上)不会有太大帮助。

编辑:我刚刚意识到您更多地指的是完整的云计算,而不是在一台机器上运行多个进程......不过,我下面的建议仍然有效...... PyTables 非常适合核外计算!

您提到您正在使用 numpy 的 mmap 来访问数据。因此,您的执行时间可能在很大程度上取决于您的数据在磁盘上的结构。

在物理硬件必须花费大部分时间寻找的任何情况下(例如,在 C 有序 3D 数组中沿恒定 Z 平面读取切片),内存映射实际上可能非常慢。缓解这种情况的一种方法是更改​​数据的排序方式,以减少访问您最可能需要的部分所需的搜索次数。

另一个可能有帮助的选项是压缩数据。如果您的进程非常受 IO 限制,您实际上可以通过压缩磁盘上的数据(有时甚至是内存中的数据)并在进行计算之前即时解压缩它来获得显着的加速。

好消息是,有一个非常灵活、面向 numpy 的库已经组合在一起,可以帮助您解决这两个问题。看看pytables

如果tables.Expr 没有显着(约 1 个数量级)优于使用 memmapped 数组的核外计算,我会感到非常惊讶。 See here 是一个很好的(虽然是罐装的)例子。从那个例子:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2011-04-30
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多