2012-04-25 9 views
6

私は大きすぎてメモリ(2000x2500000、float)で効果的にハンドリングすることができないようです。私はスパースlil_array(scipy)にそれを形成することができますが、列または行圧縮圧縮された配列(A.tocsc()、A.tocsr())を出力しようとすると、マシンのメモリが不足します。テキストファイル4.4Gのデータとpickelされたlil配列12Gとの間には、生データサイズにより近いディスクフォーマットがあることが良いでしょう)。numpyのディスクアレイ上に大きな文字

将来的にはさらに大きな配列をハンドリングすることになるでしょう。

質問:通常のnumpy関数を透過的に使用できるように、大規模なディスクアレイを処理する最善の方法は何ですか。例えば、行と列、ベクトル積、最大値、最小値、スライシングなどに沿った合計?

pytablesは行く方法ですか?そこに良い(高速)SQLのnumpyミドルウェア層ですか?ディスクアレイの秘密はnumpyに組み込まれていますか?

これまで(わずかに小さい)配列では、私は常に計算結果をディスクにピックキャッチしました。これは、配列が< 4G程度になっても終わり、もはや耐えられなくなったときに機能します。

+0

アレイを酸洗したときに、必ずバイナリプロトコルを使用しましたか?デフォルトのテキストプロトコルを使用している場合、これは膨大なファイルサイズの原因になる可能性があります。 – DaveP

答えて

2

多くの場合、マルチギガバイトの数値行列を処理するのにmemory-mapped numpy arraysを使用します。私は彼らが私の目的のために本当にうまく動作することがわかります。明らかに、データのサイズがRAMの量を超える場合、thrashingを避けるためにアクセスパターンに注意する必要があります。

+0

これは実行可能かもしれませんが、スパース配列ではかなり非効率的です。スパース版はありますか? –

+0

@AnthonyBak:私が知っているわけではありません。しかし、2000x100000の密度の高い「float32」の配列は、サイズが800MBしかありません(ディスクとメモリの両方)。 – NPE

+0

はい、元の質問に誤字がありました。それは2000x2500000と言っているはずです。 –

関連する問題