1

状況

与えられた値のリストを使用して行列を作成する手順があります!そして、リストはリスト内の10万または百万の値のように大きくなり始め、その結果、百万x百万のサイズのマトリックスになります。

手順では、行、列、または要素のみに基づいて、行列に対していくつかのadd / sub / div/multiply操作を実行しています。

問題

マトリックスが非常に大きいので、メモリ内で操作全体を実行してもうまくいかないと思います。

質問

したがって、私の質問は次のようになります。この巨大なマトリックスと巨大な値のリストをどのように操作する必要がありますか?どこに保存するか、どのように読むかなど、マトリックス上で操作を実行でき、コンピューターが動かなくなったりすることはありません。

4

4 に答える 4

2

NumPyの使用をお勧めします。算術演算は非常に高速です。

于 2012-05-17T09:55:56.393 に答える
1

辞書の使用を検討しましたか?行列が非常にスパースである場合は、次のように格納できる可能性があります。

matrix = {
 (101, 10213) : "value1",
 (1099, 78933) : "value2"
}
于 2012-05-17T08:55:21.680 に答える
1

何よりもまず、このようなマトリックスには10Gの要素が含まれます。有用な操作には、それぞれ4〜8バイトを使用する30G要素が必要になることを考えると、32ビットコンピューターで何らかのメモリ内技術を使用してこれを行うことはまったく想定できません。これを解決するには、a)本物の64ビットマシン、b)ストレージ用のメモリマップトバイナリファイル、c)ditchpythonを使用します。

アップデート

そして、以下で計算したように、2つの入力行列と1つの出力行列がある場合、100000 x 10000032ビットのfloat/integer要素、つまり120 GB(ただし、GiBではありません)のデータになります。家庭用コンピューターで一定の100MB/ s I / O帯域幅を達成できると仮定すると、加算と減算を含むすべての操作で行列のすべての要素にアクセスする必要があり、操作の絶対下限は120 GB /(100 MB / s)= 1200秒、つまり1つの行列演算の場合は20分。Cで記述され、オペレーティングシステムを可能な限り効率的に使用し、IOをメンプします。百万×百万の要素の場合、各操作には100倍の時間、つまり1。5日かかります。また、その間ハードディスクが飽和状態になると、コンピュータが完全に使用できなくなる可能性があります。

于 2012-05-17T08:55:37.550 に答える
0

配列ではデータ構造を使用できません。大きすぎます。行列がたとえばバイナリ行列である場合、同じバケットにゼロのより大きなブロックを一緒にハッシュするような、そのストレージの表現を見ることができます。

于 2012-05-17T21:14:45.047 に答える