巨大配列を回すとメモリーエラーが発生してしまう問題を解決するのと、できるかぎり速い処理速度のシステムに改良したいです。
下記のテストコードは自分なりに記述しましたが、まだまだなところが多くあると思います。
ご教授いただければ幸いです。
import numpy as np import random from joblib import Parallel, delayed import time #ベクトルのビン番号を検索 def searchBin(data,bin,num): bins=np.apply_along_axis(lambda b: np.array(np.digitize(data, b),dtype='int32'), 2, bin) return bins,num #並列化処理 def multimethod(func,datas,bin): processed = Parallel(n_jobs=6)([delayed(func)(data,bin,i) for i,data in enumerate(datas)])#コア数は6が最大 processed.sort(key=lambda x: x[1])#元の順に並び替え processed_data = [t[0] for t in processed]#元の要素だけ抽出 return processed_data def main(): N1=100 #実際は10000~50000の値が入るがメモリーエラーが発生してしまう。 N2=17 #固定 bin = np.array(np.reshape(np.arange(N2*N1*4*11), (N2,N1, 4,11))) bin=bin/bin.size#正規化 #data= np.array(np.reshape(np.arange(N2*(N1-2)*150), (N2,(N1-2),150)))#処理速度テスト用のベクトル数が同じ行列 data=np.array([[np.array([random.random() for j in range(random.randint(1,150))]) for i in range(N1-2)]for n in range(N2)]) #実際はベクトル数がランダムに異なる行列 data=data/data.size#正規化 start = time.time() result = [multimethod(searchBin,datas,bins)for datas,bins in zip(data, bin)]#10000以上だとここでメモリーエラーが発生 elapsed_time = time.time() - start print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")#処理時間表示 if __name__ == '__main__': main()

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/07 09:06