如何高效且经济地运行多个Python程序实例?
我写了一个程序,它调用了一个这样的函数:
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 个回答
根据你的描述,听起来你的问题主要是输入输出(IO)瓶颈... 在这种情况下,使用并行处理(至少在一个IO设备上)可能帮助不大。
补充一下:我刚意识到你说的是完整的云计算,而不是在一台机器上运行多个进程... 不过我下面的建议还是适用的.... PyTables在处理超大数据时非常不错!
你提到你在使用numpy的mmap来访问数据。因此,你的执行时间很可能会受到数据在磁盘上结构的影响。
在某些情况下,内存映射的速度可能会很慢,尤其是当硬件大部分时间都在寻找数据时(比如在一个C顺序的三维数组中,沿着固定Z轴读取一片数据)。一种解决办法是改变数据的排列方式,以减少访问你最可能需要的部分时所需的寻址次数。
另一个可能有帮助的选项是压缩数据。如果你的处理过程非常依赖IO,通过在磁盘上(有时甚至在内存中)压缩数据,然后在计算前实时解压,可以显著提高速度。
好消息是,有一个非常灵活、以numpy为导向的库已经准备好了,可以帮助你解决这两个问题。你可以看看pytables。
我会很惊讶如果tables.Expr
的性能没有显著(大约快一个数量级)超过你使用内存映射数组进行的超大数据计算。这里有个不错的例子,虽然是个示例,但很有参考价值。从那个例子中: