大きな行列をディスクに保存するには、numpy.memmap を使用します。
大きな行列の乗算をテストするサンプル コードを次に示します。
import numpy as np
import time
rows= 10000 # it can be large for example 1kk
cols= 1000
#create some data in memory
data = np.arange(rows*cols, dtype='float32')
data.resize((rows,cols))
#create file on disk
fp0 = np.memmap('C:/data_0', dtype='float32', mode='w+', shape=(rows,cols))
fp1 = np.memmap('C:/data_1', dtype='float32', mode='w+', shape=(rows,cols))
fp0[:]=data[:]
fp1[:]=data[:]
#matrix transpose test
tr = np.memmap('C:/data_tr', dtype='float32', mode='w+', shape=(cols,rows))
tr= np.transpose(fp1) #memory consumption?
print fp1.shape
print tr.shape
res = np.memmap('C:/data_res', dtype='float32', mode='w+', shape=(rows,rows))
t0 = time.time()
# redifinition ? res= np.dot(fp0,tr) #takes 342 seconds on my machine, if I multiplicate matrices in RAM it takes 345 seconds (I thinks it's a strange result)
res[:]= np.dot(fp0,tr) # assignment ?
print res.shape
print (time.time() - t0)
だから私の質問は:
- この手順を使用しているアプリケーションのメモリ消費を、たとえば100Mb(または1Gbなど)の値に制限する方法。また、手順のメモリ消費を見積もる方法がわかりません(メモリは「データ" 変数が作成されますが、memmap ファイルを使用するとどのくらいのメモリが使用されますか?)
- ディスクに保存された大きな行列の乗算に最適なソリューションがあるのではないでしょうか? たとえば、データがディスクに最適に保存されていない、またはディスクから読み取られていない、適切にキャッシュされていない、ドット積が 1 つのコアのみを使用しているなど、PyTables のようなものを使用する必要がありますか?
また、メモリ使用量が制限された線形連立方程式 (SVD など) を解くアルゴリズムにも興味があります。おそらく、このアルゴリズムはアウトオブコアまたは反復と呼ばれ、ハードドライブ<->RAM、gpu ram<->cpu ram、cpu ram<->cpuキャッシュなどの類推があると思います。
また、ここで PyTables の行列乗算に関する情報を見つけました。
また、これはRで見つけましたが、PythonまたはMatlabに必要です。