[英]Running multiple instances of a python program efficiently & economically?
我写了一个用以下原型调用函数的程序:
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个不同的二进制文件,其中包含所有单独扫描的结果。 请注意,每个函数“run”都是独立的(意味着,各个运行之间没有任何依赖关系)。
所以问题是这个。 在家里只有一台PC,显然我需要大约4。5年(10,000次运行×每次运行4小时= 40,000小时〜= 4。5年)才能在家完成所有运行。 但是,我希望在一到两周内完成所有的运行。
我知道解决方案将涉及一次访问许多计算资源。 什么是最好的(最快/最实惠,因为我的预算有限)这样做的方式? 我必须购买一台强大的服务器(费用多少?)或者我可以在线运行吗? 在这种情况下,通过这样做,我的propritary代码是否暴露?
如果有帮助,'Process()'的每个实例只需要大约500MB的内存。 谢谢。
好吧,根据你的描述,它听起来像IO绑定...在这种情况下,并行性(至少在一个IO设备上)不会有太大帮助。
编辑:我刚刚意识到你更多地指的是完整的云计算,而不是在一台机器上运行多个进程...我的建议仍然有用,但是...... PyTables非常适合核心外计算!
您提到您正在使用numpy的mmap来访问数据。 因此,您的执行时间很可能在很大程度上取决于您的数据在光盘上的结构。
在物理硬件必须花费大部分时间来寻求的任何情况下(例如,在C有序3D阵列中沿着常数Z的平面读取切片),Memmapping实际上可能非常慢。 减轻这种情况的一种方法是更改订购数据的方式,以减少访问您最有可能需要的部件所需的搜索次数。
另一个可能有用的选项是压缩数据。 如果您的进程受到极大的IO限制,您实际上可以通过压缩磁盘上的数据(有时甚至是内存中)并在进行计算之前即时解压缩来获得显着的加速。
好消息是,有一个非常灵活,面向numpy的库已经被整合在一起,可以帮助你解决这两个问题。 看看pytables 。
如果tables.Expr
没有显着(~1个数量级),使用memmapped数组优于你的核外计算,我会感到非常惊讶。 在这里看到一个很好的(虽然罐头)的例子。 从那个例子:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.