高效地运行python程序的多个实例&;经济上?

高效地运行python程序的多个实例&;经济上?,python,numpy,cython,Python,Numpy,Cython,我编写了一个程序,用以下原型调用函数: 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

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

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).
我的目标是以最快、最经济的方式运行此函数10000次(针对10000个不同的“n”值)。在这些运行之后,我将有10000个不同的二进制文件以及所有单独扫描的结果。请注意,每个函数“运行”都是独立的(也就是说,各个运行之间没有任何依赖关系)

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

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


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

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

另外,难道不可能将
进程
分解为并行运行的独立函数吗?函数中的数据依赖关系如何

最后,你可以尝试一下云计算服务(别忘了阅读工具),但它不会便宜(EC2的起价是每小时0.085美元)——另一种选择是去一所有计算机集群的大学(现在它们很普遍,但如果你认识那里的人,会更容易)


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

好吧,从你的描述来看,这听起来像是IO绑定的。。。在这种情况下,并行性(至少在一个IO设备上)不会有多大帮助

编辑:我刚刚意识到你指的是完整的云计算,而不是在一台机器上运行多个进程。。。不过,我下面的建议仍然有效。。。。PyTables对于核心外的计算非常好

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

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

另一个可能有用的选项是压缩数据。如果您的进程非常受IO限制,那么您可以通过压缩磁盘上的数据(有时甚至是内存中的数据)并在执行计算之前动态解压缩数据来获得显著的加速

好消息是,有一个非常灵活的、面向numpy的库,已经组合在一起,可以帮助您完成这两个方面的工作。看一看

如果没有显著(~1个数量级)超过使用memmapped数组进行的核心外计算,我会非常惊讶。举个不错的(虽然是罐装的)例子。从这个例子来看:


什么是
过程
做的?如果没有进一步的信息,我认为要将速度提高2倍以上(假设是双核)是不容易的。肯尼特:谢谢你的回答。即使运行时间减少一半(这不太可能),我仍然需要2.5年才能运行所有内容。因此,这里的重点是问题的并行化方面。如果你对此有一个好主意,那就太好了。B:二进制文件不会缓存在内存中,因为它们太大,无法放入内存。我使用numpy的mmap()读取文件,速度非常非常快,非常有趣。谢谢你提醒我这件事。
import cloud
cloud.call(function)