5

次のプロトタイプで関数を呼び出すプログラムを作成しました。

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 回 (「n」の 10,000 の異なる値に対して) 最速かつ最も経済的な方法で実行することです。これらの実行に続いて、個々のすべてのスキャンの結果を含む 10,000 の異なるバイナリ ファイルが作成されます。すべての関数「実行」は独立していることに注意してください (つまり、個々の実行の間に依存関係はまったくありません)。

質問はこれです。自宅に PC が 1 台しかない場合、自宅ですべての実行を完了するには約 4.5 年 (10,000 回の実行 x 実行あたり 4 時間 = 40,000 時間 ~= 4.5 年) かかることは明らかです。それでも、すべての実行を 1 ~ 2 週間以内に完了させたいと考えています。

ソリューションには、一度に多くのコンピューティング リソースにアクセスすることが含まれることを私は知っています。そのための最良の(予算が限られているため、最速/最も手頃な価格の)方法は何ですか?強力なサーバーを購入する必要がありますか (費用はいくらですか?)、それともオンラインで実行できますか? そのような場合、そうすることで私の独自のコードが公開されますか?

それが役立つ場合、「Process()」のすべてのインスタンスは約 500MB のメモリしか必要としません。ありがとう。

4

3 に答える 3

9

PiCloud をチェックしてください: http://www.picloud.com/

import cloud
cloud.call(function)

多分それは簡単な解決策です。

于 2010-08-29T19:31:52.183 に答える
1

さて、あなたの説明から、物事は IO バウンドのように聞こえます...その場合、並列処理 (少なくとも 1 つの IO デバイス上) はあまり役に立ちません。

編集:1台のマシンで複数のプロセスを実行するのではなく、完全なクラウドコンピューティングについて言及していることに気付きました...ただし、以下の私のアドバイスはまだ有効です.... PyTablesはコア外の計算に非常に適しています!

numpy の mmap を使用してデータにアクセスしていると述べました。したがって、実行時間は、ディスク上でのデータの構造に大きく依存する可能性があります。

実際、物理ハードウェアがシークにほとんどの時間を費やさなければならない状況 (たとえば、C 順序付けされた 3D 配列の定数 Z の平面に沿ったスライスの読み取り) では、メマッピングは非常に遅くなる可能性があります。これを軽減する 1 つの方法は、データの順序付け方法を変更して、必要になる可能性が最も高い部分にアクセスするために必要なシークの回数を減らすことです。

役立つ可能性のある別のオプションは、データの圧縮です。プロセスが非常に IO バウンドである場合、計算を実行する前に、データをディスク上 (場合によってはメモリ内) で圧縮し、オンザフライで解凍することで、実際に大幅な速度向上を実現できます。

幸いなことに、非常に柔軟で numpy 指向のライブラリがあり、これらの両方を支援するために既にまとめられています。pytablesを見てください。

tables.Exprmemmap 配列を使用したコア外計算よりも大幅に (~ 1 桁) 優れていない 場合、私は非常に驚かれることでしょう。素敵な(缶詰ですが)例については、こちらを参照してください。その例から:

PyTables vs Numpy Memmap

于 2010-08-30T15:45:20.563 に答える
1

バイナリ ファイルのデータに直接アクセスしますかProcess、それともメモリにキャッシュしますか? I/O 操作の使用量を減らすと効果があります。

また、Process並行して実行されている別々の関数に分割することはできませんか? 関数内のデータ依存関係はどうなっていますか?

最後に、Amazon EC2のようなクラウド コンピューティング サービスを試してみることもできますが (ツールについては、こちらをお読みください)、安くはありません (EC2 は 1 時間あたり 0.085 ドルから)。代わりに大学に行くこともできます。コンピューター クラスターを使用します (最近ではかなり一般的ですが、そこにいる人を知っていると簡単になります)。

于 2010-08-29T19:01:11.477 に答える