5

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

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 的内存。谢谢。

4

3 回答 3

9

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

import cloud
cloud.call(function)

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

于 2010-08-29T19:31:52.183 回答
1

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

另外,难道不能Process分成并行运行的单独函数吗?函数内部的数据依赖如何?

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

于 2010-08-29T19:01:11.477 回答
1

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

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

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

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

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

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

tables.Expr如果没有显着(约 1 个数量级)优于使用 memmapped 数组的核外计算, 我会感到非常惊讶。请参阅此处以获取一个不错的(虽然是罐装的)示例。从那个例子:

PyTables 与 Numpy Memmap

于 2010-08-30T15:45:20.563 回答