0

疎行列の約 1000 万個の浮動小数点数 (倍精度) を格納するソリューションを探しています。この行列は、実際には 100 万 x 100 万の要素で構成される 2 次元の三角行列です。elementは、 elementと elementの間の(i,j)実際のスコア メジャーです。格納方法は、おそらく行列を含むファイルのメモリ マッピングによって、この情報への非常に高速なアクセスを可能にする必要があります。私は確かにすべてのファイルをメモリにロードしたくありません。score(i,j)ij

class Score(IsDescription):
    grid_i = UInt32Col()
    grid_j = UInt32Col()
    score  = FloatCol()

pytablesクラスを公開して使用しようとしましたが、すべての行をスキャンしないScoreと要素に直接アクセスできません。i,jなにか提案を?

4

2 に答える 2

1

1,000 万個の倍精度浮動小数点数は、80 MB のメモリを占有します。CSR または CSC形式で 100 万 x 100 万のスパース マトリックスに格納する場合、追加で 1100 万の int32 が必要になり、合計で約 125 MB になります。これはおそらく、システムの物理メモリの 7% 未満です。また、私の経験では、32 ビット バージョンの Python を実行している 4GB のシステムでは、その 10 倍を取得しようとするまで、配列の割り当てに問題が発生することはめったにありません。

コンピューターで次のコードを実行します。

for j in itertools.count(100) :
    try :
        a = np.empty((j * 10**6,), dtype='uint8`)
        print 'Allocated {0} MB of memory!'.format(j)
        del a
    except MemoryError:
        print 'Failed to allocate {0} MB of memory!'.format(j)
        break

そして、上で計算した量の少なくとも 4 倍を取得できない場合を除き、scipy.sparseフォーマットを使用してすべてをメモリに貼り付けることを躊躇しないでください。

私はpytablesの経験がなく、numpyのmemmap配列の経験もあまりありません。しかし、いずれの場合も、スパース性を処理するためのロジックをコーディングする必要があるように思われます。これは、不可能でない限り避けようとするものです。

于 2013-01-25T15:40:11.563 に答える
0

を使用する必要がありますscipy.sparseフォーマットと使用法についての詳細は次のとおりです。

于 2013-01-25T12:23:51.617 に答える