需要處理Gaia衛星data,資料量大程式從優,不得不學習并行處理,遇到一些問題
其中一部分,思路如下(討論在代碼后給出):
#設定輸入資料data1,data2,方便以后大量不同的data2的資料做相同的運算;而data1的資料是固定的,在這個code中切成n份供n個行程并行:
class Data1+2():
def __init__(self,data1,data2):
from multiprocessing import cpu_count
self.ncpu=cpu_count()/2 #'/2' means double thresds, no '-1' caus only 2 cpu in this thinkpad
self.data1=data1
self.data2=data2
# 定義處理程序(就在這個程序中包含了并行計算):
def def0(self):
#將data1的資料切成n份供n個行程并行計算用:
for i in range(self.ncpu):
vars()['data1'+str(i)]={} #define dict 'data1i={}'
data1size = len(self.data1data)/self.ncpu +1
idata = 0
for key,xydata1 in self.data1.items():
if len(vars()['data1'+str(idata)]) < data1size-1:
vars()['data1'+str(idata)][key] = xydata1
elif len(vars()['data1'+str(idata)]) == data1size-1:
vars()['data1'+str(idata)][key] = xydata1
idata+=1
# 為了盡量減少重復運算,將公用的資料盡可能存到高階陣列中:
d0 = arange(600,800,2)
A0 = arange(10,80,2)
d,A = ix_(d0,A0)
num_d = d.size
num_a = A.size
MAx = reshape(A+ d - d,(num_d,num_a,1,1) )
MAy = reshape(A + d,(num_a,num_d,1,1) )
from multiprocessing import Process,Queue
#定義每個行程中的函式:
def run_process(que,xydata1,xydata2,MAx,MAy):
match = {} #定義一個字典(放結果)
#......計算程序不贅述......得到結果:
match[key, Mwhere, Gwhere] = mind
#return 當前行程下產生的結果:
que.put(match)
que = Queue()
#start 每一個行程:
for idata in range(self.ncpu):
pro = Process(target=run_process, args=(que,self.gaiadata,vars()['data'+str(idata)],MAx,MAy))
pro.start()
pro.join()
#合并每一個行程的結果:
match={}
for idata in range(self.ncpu):
match=dict(match, **que.get(True))
#return 所有結果:
return match
在不同平臺測驗速度:
有臺mac是OS系統 i7的2.8G 4核8執行緒16G,thinkpad是Linux CENTOS7系統 i5的2.5G 2核4執行緒6G,另有臺Dell臺式機是Linux Ubuntu系統 i7的3.9G 4核8執行緒16G;
有一臺服務器是5節點100核,頻率2.5G左右,記憶體未獲知(未規定使用優先級,幾乎沒人用);
另有一臺小超算25節點500核,頻率2.5G左右,記憶體未獲知(規定只能提交十個任務,平時也沒什么用戶,有關服務器和超算的硬體知識,我所知甚少,只知道管這個的老師這么講了一下)
(一)當總的輸入 data1 是72個時:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/37616.html
標籤:服務器
上一篇:windows10 離線環境下使用docker,該怎樣安裝?
下一篇:數學建模
