我写了一个用以下原型调用函数的程序:
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的内存。感谢。
答案 0 :(得分:9)
答案 1 :(得分:1)
Process
是直接访问二进制文件上的数据还是将其缓存在内存中?减少I / O操作的使用应该有所帮助。
此外,是否有可能将Process
分解为并行运行的单独函数?函数内部的数据依赖性如何?
最后,您可以试试Amazon EC2等一些云计算服务(不要忘记阅读this工具),但它不会便宜(EC2起价为每小时0.085美元) ) - 另一种选择是去一所拥有计算机集群的大学(现在它们很常见,但如果你认识那里的人会更容易)。
答案 2 :(得分:1)
嗯,根据你的描述,听起来就像是IO绑定的......在这种情况下,并行性(至少在一个IO设备上)不会有多大帮助。
编辑:我刚刚意识到你更多地指的是完整的云计算,而不是在一台机器上运行多个进程...我的建议仍然有用,但是...... PyTables非常适合于核心外计算!
您提到您正在使用numpy的mmap来访问数据。因此,您的执行时间很可能在很大程度上取决于您的数据在光盘上的结构。
在物理硬件必须花费大部分时间来寻求(例如,在C有序3D阵列中沿着常数Z的平面读取切片)的任何情况下,记录映射实际上可能非常慢。减轻这种情况的一种方法是更改订购数据的方式,以减少访问您最有可能需要的部件所需的搜索次数。另一个可能有用的选项是压缩数据。如果您的进程受到极大的IO限制,您实际上可以通过压缩磁盘上的数据(有时甚至是在内存中)并在进行计算之前对其进行解压缩来获得显着的加速。
好消息是,有一个非常灵活,以numpy为导向的图书馆已经被整合在一起,可以帮助你解决这两个问题。看看pytables。
如果使用memmapped数组tables.Expr
不显着(~1个数量级)优于你的核外计算,我会感到非常惊讶。 See here一个很好的(虽然是罐头的)例子。从那个例子: