如何高效且经济地运行多个Python程序实例?

5 投票
3 回答
1132 浏览
提问于 2025-04-16 03:27

我写了一个程序,它调用了一个这样的函数:

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次运行,每次运行4小时,总共40,000小时,差不多就是4.5年)才能完成所有的运行。但我希望能在一两周内完成所有的运行。

我知道解决方案需要同时使用很多计算资源。那有什么好的方法(最快/最便宜,因为我的预算有限)来实现呢?我需要买一台强大的服务器吗(大概需要多少钱)?还是可以在线运行?如果这样的话,我的专有代码会被泄露吗?

如果有帮助的话,每次'Process()'运行只需要大约500MB的内存。谢谢。

3 个回答

1

请问Process是直接访问二进制文件里的数据,还是把数据缓存到内存里?减少输入输出操作的使用应该会有帮助。

另外,Process难道不能拆分成几个并行运行的函数吗?函数内部的数据依赖关系是怎样的呢?

最后,你可以试试一些云计算服务,比如亚马逊EC2(别忘了看看这个关于工具的讨论),不过这可不便宜(EC2的费用从每小时$0.085起)——另外一个选择是去大学找一个计算集群(现在这种集群挺常见的,但如果你认识那里的某个人会更容易)。

1

根据你的描述,听起来你的问题主要是输入输出(IO)瓶颈... 在这种情况下,使用并行处理(至少在一个IO设备上)可能帮助不大。

补充一下:我刚意识到你说的是完整的云计算,而不是在一台机器上运行多个进程... 不过我下面的建议还是适用的.... PyTables在处理超大数据时非常不错!

你提到你在使用numpy的mmap来访问数据。因此,你的执行时间很可能会受到数据在磁盘上结构的影响。

在某些情况下,内存映射的速度可能会很慢,尤其是当硬件大部分时间都在寻找数据时(比如在一个C顺序的三维数组中,沿着固定Z轴读取一片数据)。一种解决办法是改变数据的排列方式,以减少访问你最可能需要的部分时所需的寻址次数。

另一个可能有帮助的选项是压缩数据。如果你的处理过程非常依赖IO,通过在磁盘上(有时甚至在内存中)压缩数据,然后在计算前实时解压,可以显著提高速度。

好消息是,有一个非常灵活、以numpy为导向的库已经准备好了,可以帮助你解决这两个问题。你可以看看pytables

我会很惊讶如果tables.Expr的性能没有显著(大约快一个数量级)超过你使用内存映射数组进行的超大数据计算。这里有个不错的例子,虽然是个示例,但很有参考价值。从那个例子中:

PyTables vs Numpy Memmap

9

看看这个网站,PiCloud: http://www.picloud.com/

import cloud
cloud.call(function)

也许这会是一个简单的解决办法。

撰写回答