AWS EC2 c3で12-16コアを使用する場合より28-30コアを使用している間、計算時間が長い理由がわかりません。 8xlarge。私は13個のコアを使用する場合AWS EC2で16コアより32コアの方がPythonコードの方が遅い
https://www.dropbox.com/s/8u32jttxmkvnacd/Slika%20zaslona%202015-01-11%20u%2018.33.20.png?dl=0
最速の計算は次のとおりです。私はいくつかのテストと結果は以下の表にありました。これは、私が使用したコードのコードを簡略化されて
https://www.dropbox.com/s/gf3bevbi8dwk5vh/Slika%20zaslona%202015-01-11%20u%2018.32.53.png?dl=0
:私は最大のコアを使用するのであれば、それは私がc3.8xlargeの8つのコアを使用していますと同じ時間です。
import random
import multiprocessing as mp
import threading as th
import numpy as np
x=mp.Value('f',0)
y=mp.Value('f',0)
arr=[]
tasks=[]
nesto=[]
def calculation2(some_array):
global x, y, arr
p=False
a = np.sum(some_array)*random.random()
b = a **(random.random())
if a > x.value:
x.value=a
y.value=b
arr=some_array
p=True
if p:
return x.value, y.value, arr
def calculation1(number_of_pool):
global tasks
pool=mp.Pool(number_of_pool)
for i in range(1,500):
some_array=np.random.randint(100, size=(1, 4))
tasks+=[pool.apply_async(calculation2,args=(some_array,))]
def exec_activator():
global x, y, arr
while tasks_gen.is_alive() or len(tasks)>0:
try:
task=tasks.pop(0)
x.value, y.value, arr = task.get()
except:
pass
def results(task_act):
while task_act.is_alive():
pass
else:
print x.value
print y.value
print arr
tasks_gen=th.Thread(target=calculation1,args=(4,))
task_act=th.Thread(target=exec_activator)
result_print=th.Thread(target=results,args=(task_act,))
tasks_gen.start()
task_act.start()
result_print.start()
それは2計算のコアあります:
- 計算1 - アレイを計算し、その配列を使用して計算2 のジョブを行う
- 計算2 - アレイの一部の計算のアウトを計算し、結果の比較
コードの目的は、最大xを計算し、そのyを返す配列を見つけることです。 2つの計算は同時に(スレッドを使用して)開始しますが、あまりにも多くのRAMを占有する配列が多すぎることがあるためです。
私の目標は、最速の計算を行うことです。可能であれば、すべてのコアを使用する方法について助言が必要です。
英語が正しくない場合は、事前にご連絡ください。より多くの情報が必要な場合は、お問い合わせください。
コア数が多すぎると、使用可能なRAMと比べて、仮想メモリを使用している可能性があります(ディスクとのスワッピング、単純化のため)。一般的な解決策は、より多くのRAMを取得することです。タスクの詳細によっては、ディスクから適切なシーケンシャルな方法で実際に作業する方が、仮想的な「メモリ」にすべてを吸い込むよりも速くなる可能性があります。また、ローカルSSDを「ディスク」として使用することができれば、それははるかに高速なランダムアクセスを提供することができます(AWSで行う方法はわかりませんが、Google Cloud Platformのみ)。 –
私はpsutilを使ってプロセッサとRAMを監視しています。テストされたデータでは、RAMの最大2〜3%を使用しました。私はすべてのデータとPythonコードをUbuntuサーバー(EBS)に転送します。 – matoliki
興味深いトピック。あなたはどのようにテストしますか、私はそれをマイクロインスタンス上で実行し、結果を0.2 ['[86 44 89 88]]で返します。\ n real \t 0m0.175s' – BMW