1

そのため、非常に大きなマトリックス (120000 x 120000) があり、要素を他のすべての要素と比較するスクリプトをこのマトリックス全体で実行しています。全体をメモリに保持できないため、memmap を使用します。また、マトリックスを定期的にフラッシュして、コンピューターがクラッシュしたり何かが発生したりしても、すべてのデータが失われないようにします。ただし、マトリックスに「深く」入るほど、いわばデータのフラッシュにかかる時間が長くなることに気付きました。最終的に、結果を保存するのに最大 5 分かかります。なぜこれを行っているのか誰にもわかりませんか?これを行うことができるより良い方法はありますか?いくつかのコードを投稿しますが、「間違っている」ことは何もしていないと確信しています。

OUT_DIR = '/media/sf_3dAnalysis/simMatrix/'
SIM_FILE = 'similarity.npy'
data = np.lib.format.open_memmap(OUT_DIR+SIM_FILE, mode='w+', dtype='float32', shape=(120821,120821))
#After processing a certain amount of indices, I go to flush the data.
data.flush()
4

1 に答える 1

0

mmap は、参照の局所性が小さい問題 (physmem に適合するもの) に適しています。ただし、53ギガバイトのデータにmmapを使用しているようで、参照の局所性が良くありません。

mmap に専念している場合は、このワークロードのパフォーマンスが多少低下することを受け入れる必要があるでしょう。

一部の人を助けるかもしれないことの1つは、できるだけ多くの行列をメモリに保持し(おそらく最初の行)、残りをディスクに置き(残りの行)、キャッシュしない(おそらくO_DIRECTを使用する)クラスを書くことです。 .

あなたの場合、全体をキャッシュすると、異常に大きなフィスメムがない限り、仮想メモリのスラッシングが発生する可能性があります。ただし、予算があれば、53 ギガ以上の physmem もおそらく手の届かないものではありません。

O_DIRECT ルートに進むことにした場合は、これを確認してください: http://stromberg.dnsalias.org/~strombrg/odirect/

于 2013-11-24T18:30:45.793 に答える