簡體   English   中英

高效經濟地運行python程序的多個實例?

[英]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的內存。 謝謝。

查看PiCloud: http ://www.picloud.com/

import cloud
cloud.call(function)

也許這是一個簡單的解決方案。

Process是直接訪問二進制文件上的數據還是將其緩存在內存中? 減少I / O操作的使用應該有所幫助。

此外,是否有可能將Process分解為並行運行的單獨函數? 函數內部的數據依賴性如何?

最后,你可以嘗試一些像亞馬遜EC2這樣的雲計算服務(不要忘記閱讀這個工具),但它不會便宜(EC2起價為每小時0.085美元) - 另一種方法是去大學有一個計算機集群(它們現在非常普遍,但如果你認識某人就會更容易)。

好吧,根據你的描述,它聽起來像IO綁定...在這種情況下,並行性(至少在一個IO設備上)不會有太大幫助。

編輯:我剛剛意識到你更多地指的是完整的雲計算,而不是在一台機器上運行多個進程...我的建議仍然有用,但是...... PyTables非常適合核心外計算!

您提到您正在使用numpy的mmap來訪問數據。 因此,您的執行時間很可能在很大程度上取決於您的數據在光盤上的結構。

在物理硬件必須花費大部分時間來尋求的任何情況下(例如,在C有序3D陣列中沿着常數Z的平面讀取切片),Memmapping實際上可能非常慢。 減輕這種情況的一種方法是更改​​訂購數據的方式,以減少訪問您最有可能需要的部件所需的搜索次數。

另一個可能有用的選項是壓縮數據。 如果您的進程受到極大的IO限制,您實際上可以通過壓縮磁盤上的數據(有時甚至是內存中)並在進行計算之前即時解壓縮來獲得顯着的加速。

好消息是,有一個非常靈活,面向numpy的庫已經被整合在一起,可以幫助你解決這兩個問題。 看看pytables

如果tables.Expr沒有顯着(~1個數量級),使用memmapped數組優於你的核外計算,我會感到非常驚訝。 在這里看到一個很好的(雖然罐頭)的例子。 從那個例子:

PyTables與Numpy Memmap

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM