7

大きな行列をディスクに保存するには、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)

だから私の質問は:

  1. この手順を使用しているアプリケーションのメモリ消費を、たとえば100Mb(または1Gbなど)の値に制限する方法。また、手順のメモリ消費を見積もる方法がわかりません(メモリは「データ" 変数が作成されますが、memmap ファイルを使用するとどのくらいのメモリが使用されますか?)
  2. ディスクに保存された大きな行列の乗算に最適なソリューションがあるのではないでしょうか? たとえば、データがディスクに最適に保存されていない、またはディスクから読み取られていない、適切にキャッシュされていない、ドット積が 1 つのコアのみを使用しているなど、PyTables のようなものを使用する必要がありますか?

また、メモリ使用量が制限された線形連立方程式 (SVD など) を解くアルゴリズムにも興味があります。おそらく、このアルゴリズムはアウトオブコアまたは反復と呼ばれ、ハードドライブ<->RAM、gpu ram<->cpu ram、cpu ram<->cpuキャッシュなどの類推があると思います。

また、ここで PyTables の行列乗算に関する情報を見つけました。

また、これはRで見つけましが、PythonまたはMatlabに必要です。

4

2 に答える 2

2

処理にNumExprを使用することを検討してください: https://github.com/pydata/numexpr

... 内部では、NumExpr は、メモリ内の最適なサイズのデータ​​ ブロックを効率的に操作するために、チャンク読み取り戦略を中心に設計された独自のベクトル化された仮想マシンを採用しています。適切に調整されていれば、ナイーブな NumPy 操作を簡単に打ち負かすことができます。

NumExpr は、問題の内訳の 2 番目をカバーする場合があります。ストリーミング可能なバイナリ形式を使用して #1 に対処する場合は、データ ファイルをロードするときに、次のようにチャンク読み取りアプローチを使用できます。

    with open('path/to/your-data.bin', 'rb') as binary:
        while True:
            chunk = binary.read(4096) # or what have you
            if not chunk:
                break

それが低レベルすぎる場合は、HDF5ライブラリとフォーマットを参照することをお勧めします。このh5pyモジュールは、圧縮、チャンク読み取り、dtypes、メタデータなどをサポートしています。

幸運を!

于 2014-05-08T11:50:19.727 に答える