質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Q&A

解決済

1回答

7330閲覧

pythonにおける巨大配列のメモリ―エラーが発生してしまう問題、処理速度を解決したい

taiki9121

総合スコア18

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

0グッド

1クリップ

投稿2019/02/06 17:43

編集2019/02/06 17:48

巨大配列を回すとメモリーエラーが発生してしまう問題を解決するのと、できるかぎり速い処理速度のシステムに改良したいです。
下記のテストコードは自分なりに記述しましたが、まだまだなところが多くあると思います。
ご教授いただければ幸いです。

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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

処理の中身は見ていないので、もしかしたら他に効率の良いやり方があるのかもしれませんが。

python

1 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)]) #実際はベクトル数がランダムに異なる行列

この行が異様に遅かったので、書き換えました。

python

1 data=np.array([[np.random.random(size=(random.randint(1, 150),)) 2 for i in range(N1-2)] 3 for n in range(N2)]) #実際はベクトル数がランダムに異なる行列

実行してみたところ、#10000以上だとここでメモリーエラーが発生の行で受け取るデータが純粋にでかいのでどうにもならないと思いました。

オンメモリでやろうとしないで、結果を逐次分割してストレージにダンプしながら実行するような仕組みを作るしかないと思います。

投稿2019/02/07 03:18

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taiki9121

2019/02/07 09:06

ご教授いただきありがとうございました。 おっしゃる通り、配列を分割して処理したらうまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問